最接近的三数之和

题目描述


给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

来源:LeetCode

解法一

暴力法三次循环,时间复杂度是O(N^3),如何降低复杂度?我们知道,在数组无序的情况下,只能采用这种遍历的方法,没有启发式搜索的信息。所以先排序,之后每个元素i,都依次遍历其[i+1,n]范围内的和,保存最接近target的和,遍历结束后输出即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int n = nums.size();
if(n <= 2) return -1;
sort(nums.begin(), nums.end());
int min_diff = INT_MAX;
int closest_sum;
for(int i = 0; i < n; i++) {
int left = i+1;
int right = n-1;
while(left < right) {
// calc diff
int sum = nums[i] + nums[left] + nums[right];
int diff = abs(target-sum);
if(diff < min_diff) {
min_diff = diff;
closest_sum = sum;
}
if(sum == target) {
// 必然是最小的 直接返回则节省时间
return sum;
} else if (sum > target) {
--right;
} else {
++left;
}
} // end while
}
return closest_sum;
}
};