题目:
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
思路:排序 + 双指针。
class Solution {
public:
inline int abs(int a, int b) {return a > b ? a - b : b - a;}
int threeSumClosest(vector<int> &num, int target) {
if (num.size() < 3) return -1;
sort(num.begin(), num.end());
int sum = num[0] + num[1] + num[2];
for (int i = 0; i < (int)num.size() - 2; ++i) {
int start = i + 1;
int end = (int)num.size() - 1;
while (start < end) {
int current_sum = num[i] + num[start] + num[end];
if (current_sum == target) { //find the target, return
return current_sum;
} else if (current_sum < target) {
start++;
if (abs(current_sum, target) < abs(sum, target)) { //find a closer one, update
sum = current_sum;
}
} else {
end--;
if (abs(current_sum, target) < abs(sum, target)) { //find a closer one, update
sum = current_sum;
}
}
}
}
return sum;
}
};
总结:同3Sum,双指针逼近目标值,不断更新。如果找到和等于目标值,直接返回。复杂度O(n^2),brute force复杂度O(n^3).