Leetcode.16. 3Sum Closest

题目

给定一个数组和一个目标数, 找出数组中3个数字的和最接近目标数的和.

Example:
input: [-1, 2, 1, -4]
output: 2

思路

先排序, 将3个数字求和转化为2个数字求和.

先固定一个数字, 通过首尾向中间靠拢的方式, 找出两个数字的和, 每次比较最接近的和.

int threeSumClosest(vector& nums, int target) {
        if (nums.size() < 3) {
            return 0;
    }
    sort(nums.begin(), nums.end());
    int result = nums[0] + nums[1] + nums[2];
    for (int i = 0; i < (int)nums.size() - 2;i++) {
        if(i> 0 && nums[i] == nums[i - 1]) continue;
        int x = target-nums[i];
        int l = i + 1, r = (int)nums.size() - 1;
    
        while (l < r) {
            int lNum = nums[l];
            int rNum = nums[r];
            if (lNum + rNum == x) {
                return target;
            } else if (lNum + rNum > x) {
                if (abs(lNum + rNum - x) < abs(result - target)) {
                    result = lNum + rNum + nums[i];
                }
                r--;
            } else {
                if (abs(lNum + rNum - x) < abs(result - target)) {
                    result = lNum + rNum + nums[i];
                }
                l++;
            }
        }
    }
    return result;
}

总结

先排序.

3个数字转化为2个数字求和.

你可能感兴趣的:(Leetcode.16. 3Sum Closest)