题目: 最接近的三数之和

来自智得网
跳转至: 导航、​ 搜索

方法一:暴力破解

计算所有三元组的和,然后比较这些和和目标值差值的绝对值,最小的差值就是要求解的结果。

因为要计算所有的三元组,所以需要有三层循环,时间复杂度是O(n3)。

暴力破解的时间复杂度较高,三数之和有几种解法,对于三数之和应该和是固定的准确值,固定一个值之后,可以通过Hash法求解两数之和。但是对于求最接近目标值的和,Hash法无法解决。

三数之和有一种方法是排序之后采用双指针进行求解,因为排序之后采用双指针可以对数据的和进行较好的排序,所以本题可以采用双指针的方式求解。

方法二:双指针

首先将数组排序。

轮询数组的每个数字,假如为an

固定an,之后定义两个指针分别指向数组的头尾部。计算头尾指针指向的两个数字的和。

如果该值大于target-an,头指针右移计算出来的值会更大,所以三数之和的和target的差值也会更大,此时可以将尾部指针左移,此时计算出来的两数之和之和会更小,可能是更接近target-an的值。

同理,如果该值小于target-an,则将头部指针右移。

移动过程中计算两个指针指向的数字之和和target-an差值的绝对值,并计算最小值。

以此固定数组中的每个数字,之后采用双指针进行计算出最小值。最后比较这些最小值得出全局最小值。

双指针的时间复杂度是O(n2)。