【左右端点指针】LeetCode - 16. 最接近的三数之和

题目描述

题目链接
在这里插入图片描述

解法

思路已经在【左右端点指针】LeetCode - 15. 三数之和 中较为详细地解释过了,不同的是,本题已经假定了只有唯一答案,所以不需要去重;这次不是和 0 比较,而是比较 abs(target-sum) 和 abs(target-ans)

另外的两个小优化(其实15中也体现了)

  • 当我们枚举到恰好等于 target 的 a+b+c 时,可以直接返回 target 作为答案,因为不会有再比这个更接近的值了。
  • 当我们枚举 a,b,c 中任意元素并移动指针时,可以直接将其移动到下一个与这次枚举到的不相同的元素,减少枚举的次数
class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
        int ans = nums[0] + nums[1] + nums[2];
        int len = nums.size();
        for(int i = 0; i < len; i++)
        {
            //保证和上一次枚举的元素不一样
            if(i > 0 && nums[i] == nums[i-1])
             continue;
            int start = i + 1, end = len - 1;
            while(start < end)
            {
                int sum = nums[start] + nums[end] + nums[i];
                //如果等于target,直接返回
                if(sum == target)
                 return target;
                if(abs(target-sum) < abs(target-ans))
                 ans=sum;
                if(sum > target)
                 end--;
                else
                 start++;
            }
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值