leetcode16——带绝对值的最接近三数之和

题目链接:https://leetcode-cn.com/problems/3sum-closest/solution/zui-jie-jin-de-san-shu-zhi-he-by-leetcode-solution/

思路:借助双指针对枚举进行优化。如果pb,pc当前指向元素大于target,则将pc向左移动,因为以pc为第三个数的指针的pa,pb,pc已经指向最接近target的值。如果小于target,则将pb向右移动,因为以pb为第二个数指针的当前三指针已经达到最接近target。

如果 a+b+c≥target,那么就将 pc​ 向左移动一个位置;


如果 a+b+c<target,那么就将 pb​ 向右移动一个位置。

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        int len=nums.size();
        int result;
        int distance_cur=INT_MAX;
        for(int i=0;i<len-2;i++)
        {
            if(i>0&&nums[i-1]==nums[i])
                continue;
            int third=len-1;
            int second=i+1;
            while(second<third)
            {
                if(nums[i]+nums[second]+nums[third]==target)return target;
                if(nums[i]+nums[second]+nums[third]-target>0)
                {
                    int third_temp=third-1;
                    if(nums[i]+nums[second]+nums[third]-target<distance_cur)
                    {
                        result=nums[i]+nums[second]+nums[third];
                        distance_cur=nums[i]+nums[second]+nums[third]-target;
                    }
                    while(second<third_temp&&nums[third_temp]==nums[third])
                        third_temp--;
                    third=third_temp;

                }
                else 
                {
                    int second_temp=second+1;
                    if(target-nums[i]-nums[second]-nums[third]<distance_cur)
                    {
                        result=nums[i]+nums[second]+nums[third];
                        distance_cur=target-nums[i]-nums[second]-nums[third];
                    }
                    while(second_temp<third&&nums[second_temp]==nums[second])
                        second_temp++;
                    second=second_temp;
                }
                }
        }
        return result;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值