接近target:大于或小于两种情况。但是实际操作中只需考虑大于的情况,找到之后结果的前一个数也有可能是结果,进行比较(更新结果res)。第二种情况的实现依靠右指针的移动
思路类似15
对于每个 j ,找到一个最小的 k ,使得满足条件(j变大,k一定减小即 k-- )
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
//int res = 0, m = 0;
//不这样声明变量,改用pair存储差值和三数之和(最终结果在其中)
pair<int,int> res(INT_MAX, INT_MAX);//找小值,初始设为无穷大
sort(nums.begin(), nums.end()); //为双指针做准备
for(int i = 0; i<nums.size(); i++){
for(int j=i+1, k=nums.size()-1; j<k; j++){
while(k-1>j && nums[i]+nums[j]+nums[k-1]>=target)
k -- ; //指针左移的情况
int s = nums[i]+nums[j]+nums[k];//求和
res = min(res, make_pair(abs(s-target),s));
if(k-1 > j){ //第二种情况
s = nums[i]+nums[j]+nums[k-1];
res = min(res, make_pair(target-s, s));
}
}
}
return res.second; //返回结果res值的second
}
};
//问题:变量冗余(三数之和大于res时,跳出)