LeetCode-016. 3Sum Closest

1. 题目

3Sum Closest

求最接近target的三数之和
假定每个输入都只有一个解决方案

2. 分析

要保证三数和跟target差的绝对值最小
brute force时间复杂度为O(n^3)
优化的解法是先排序再左右夹逼
我们需要定义一个变量diff用来记录差的绝对值
先确定一个数,再滑动寻找另外两个数
每确定两个数,求出此三数之和
再算和target的差的绝对值存在newDiff中
然后和diff比较并更新diff和结果result即可
总的时间复杂度为O(n^2+nlogn)=(n^2),空间复杂度是O(1)
一定要特别注意不要遗漏sort(nums.begin(), nums.end());

3. 代码

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int len = nums.size();
        if(len < 3)
            return 0;

        sort(nums.begin(), nums.end());
        int result = nums[0] + nums[1] + nums[2];
        int minDiff = abs(target - result);

        for(int i = 0; i < len - 2; ++i)
        {
            int j = i + 1;
            int k = len - 1;

            while(j < k)
            {
                int sum = nums[i] + nums[j] + nums[k];
                // 不要写成 targe - result
                int newDiff = abs(target - sum);

                if(newDiff < minDiff)
                {
                    result = sum;
                    minDiff = newDiff;
                }

                if(sum < target)
                    ++j;
                else
                    --k;
            }
        }

        return result;
    }
};

完整源代码放于github

猜你喜欢

转载自blog.csdn.net/tao_ba/article/details/80848561