力扣 16 最接近的三数之和 C++

这道题和15题的思路是一样的都是先遍历,之后采用左右指针进行移动找出最接近的数值

class Solution {
public:
    int threeSumClosest(vector& nums, int target) {
        // 排序
       sort(nums.begin(), nums.end());
        int closestNum = nums[0] + nums[1] + nums[2];
        for (int i = 0; i < nums.size() - 2; i++) {
            int l = i + 1, r =  nums.size() - 1;
            while (l < r){
                int threeSum = nums[l] + nums[r] + nums[i];
                if (abs(threeSum - target) < abs(closestNum - target)) {
                    closestNum = threeSum;
                }
                if (threeSum > target) {
                    r--;
                } else if (threeSum < target) {
                    l++;
                } else {
                    // 如果已经等于target的话, 肯定是最接近的
                    return target;
                }

            }

        }

        return closestNum;
    }
};

最开始的失败的原因是漏解,一直在进行的是差距大小之间的比较,但是这个比较只比较一次就行了,之后就直接用最新的三数之和与target进行比较,移动指针,这样就可以保证所有的解都能够遍历到。

你可能感兴趣的:(算法)