跳转至

16.最接近的三数之和 (Medium)*

题目描述*

标签*

双指针;

思路 & 代码*

之前做过三数之和的题,找到和为 0 的三个数,排序之后在当前元素后找到满足条件的两个元素即可。

到这个题,最简单的当然还是暴力,时间复杂度 O(n^3)

再就是根据上一题的思路,排序之后双指针。要注意的是当和为 target 时直接返回就行了。

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int n = nums.size();
        int res = 0;
        int diff = INT_MAX;
        for(int i = 0; i < n; i++) {
            for(int j = i + 1; j < n; j++) {
                for(int k = j + 1; k < n; k++) {
                    int curDiff = abs(nums[i] + nums[j] + nums[k] - target);
                    if(curDiff < diff) {
                        diff = curDiff;
                        res = nums[i] + nums[j] + nums[k];
                    }
                }
            }
        }
        return res;
    }
};
class Solution {
private:
    void quickSort(vector<int>& nums, int l, int r) {
        if(l > r) {
            return;
        }
        swap(nums[l], nums[l + rand() % (r - l + 1)]);
        int finalPos = l + 1;
        for(int i = l + 1; i <= r; i++) {
            if(nums[i] < nums[l]) {
                swap(nums[i], nums[finalPos++]);
            }
        }
        swap(nums[l], nums[--finalPos]);
        quickSort(nums, l, finalPos - 1);
        quickSort(nums, finalPos + 1, r);
    }
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int n = nums.size();
        // sort(nums.begin(), nums.end());
        quickSort(nums, 0, n - 1);
        int res = 0;
        int diff = INT_MAX;
        for(int i = 0; i < n; i++) {
            int l = i + 1, r = n - 1;
            while(l < r) {
                int curSum = nums[i] + nums[l] + nums[r];
                int curDiff = abs(curSum - target);
                if(curDiff < diff) {
                    res = curSum;
                    diff = curDiff;
                }
                if(curSum > target) {
                    r--;
                }else if(curSum < target){
                    l++;
                }else {
                    return res;
                }
            }
        }
        return res;
    }
};

最后更新: July 23, 2022