16.最接近的三数之和

这道题和15.三数之和的思想一样,都是用双指针将n的三次方复杂度降低为n的平方,一定要排序

这道题用了一个优化:

如果 a+b+c ≥target,那么就将k向左移动一个位置;

如果 a+b+c<target,那么就将j向右移动一个位置。

 

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        if(nums.size() == 0) return 0;
        sort(nums.begin(), nums.end());
        int ans = 0xfffffff;
        for(int i = 0; i < nums.size()-2; i ++)
        {
            int j = i + 1, k = nums.size() - 1;
            while(j < k)
            {
                abs(target - ans) > abs(target - nums[i] - nums[j] - nums[k]) ? ans = nums[i] + nums[j] + nums[k] :                  ans += 0;
                if(nums[i] + nums[j] + nums[k] > target) k--;
                else j++;
            }
        }
        return ans;
    }
};

 

posted @ 2020-11-14 20:36  ATKevin  阅读(66)  评论(0编辑  收藏  举报