类似15. 3Sum,先对数组进行排序,外层循环就是遍历一遍数组,内层循环就是用两个指针low和high,与3sum不同的就是 每次循环要判断记录当前sum和target的差值。 时间复杂度O(n^2)
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int len = nums.size();
long long res=nums[0] + nums[1] + nums[2], min_gap, sum, curr_gap; // 防止溢出所以用long long型
min_gap = abs(res - target);
sort(nums.begin(), nums.end());
for(int i = 0; i < len - 2; i++){
int low = i + 1, high = len - 1;
while(low < high){
sum = nums[i] + nums[low] + nums[high];
curr_gap = abs(sum - target);
if(curr_gap < min_gap){
res = sum;
min_gap = curr_gap;
}
if(target < sum) high--;
else if(target > sum) low++;
else return target;
} // low == high
}
return res;
}
};