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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章