Leetcode Problem16

本文介绍了一种高效算法来解决3SumClosest问题,即从数组中找出三个数,使它们的和最接近给定的目标值。通过排序和双指针技巧,文章详细解释了如何找到这个最接近的和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3Sum Closest

问题描述:给定任意一个数组和一个目标值target,要求从数组中找到三个数使得这三个数的和最接近target。

这道问题是上一道问题(3Sum)的衍生问题,要找到最接近target的三个数的和(假设为sum),我们定义一个res等于target与sum的差的绝对值,找到res的最小值即可。跟上一题一样,我们还是先将数组进行从小到大排列,然后固定住第一个数字,用两个指针分别指向除固定数字外剩余数组的头尾,计算出此时res的值,通过比较储存res较小的那个值以及对应的sum。接下来进行指针的移动,如果sum小于target,那么头指针右移,否则,尾指针左移,依此类推,直到头尾指针相遇则停止。

int threeSumClosest(vector<int> &nums,int target)
{
    sort(nums.begin(),nums.end());
    int closest=nums[0]+nums[1]+nums[2];
    int res=abs(closest-target);
    for(int i=0;i<nums.size()-2;i++)
    {
        int m=i+1,n=nums.size()-1;
        while(m<n)
        {
            int sum=nums[i]+nums[m]+nums[n];    
            if(abs(sum-target)<res)
            {
                closest=sum;
                res=abs(sum-target);        
            }
            if(sum<target)
                m++;
            else
                n--;
        }
    }
    return closest;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值