Leetcode Problem16

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;
}

猜你喜欢

转载自blog.csdn.net/vandance/article/details/81812500