16. 最接近的三数之和 - 力扣(LeetCode)

接近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时,跳出)