16. 3Sum Closest

题目描述:给定一个有n个整数的数组S,和目标值target,在S中找三个数使其和与目标值最接近。假定每个输入只有一个解。如:

given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

分析:思路与3Sum类似,先排序再左右夹逼,不同之处在于因为找的是最接近目标值的3元组,故设变量记录每次三元组的和与目标值的差值,记录差值最小时的三元组的和。时间复杂度O(n^2),空间O(1)。

代码

class Solution {
public:
    int threeSumClosest(vector& nums, int target) {
        
        int ans = 0;
        int mingap = INT_MAX;         //最小差值
        
        sort(nums.begin(), nums.end());
        
        for (int i = 0; i < nums.size() - 2; i ++)
        {
            int l = i + 1;
            int r = nums.size() - 1;
            
            while( l < r )
            {
                int s = nums[i] + nums[l] + nums[r];
                int gap = abs(s - target);
                
                if (gap < mingap)
                {
                    ans = s;
                    mingap = gap;
                }
                if (s < target)
                    l ++;
                else
                    r --;
            }
        }

        return ans;
    }
};

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