c++ 雙指針法實現三個數的和

誰讓我菜呢,第一反應就是要暴力解,三次循環,但是會遇到一個問題,因爲需要去除輸出中的重複項。看了大神的解答,才瞭解了雙指針的方法,但是對重複項的去除,還是一個需要詳細思考的問題。這道題其實對我最大的啓發,應該是排序的使用吧,因爲之前也考慮過用雙指針,但是如果沒有排序的話,沒辦法提升效率。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ret;
        vector<int> vtemp;
        int len=nums.size();
        sort(nums.begin(),nums.end());
        for(int i=0;i<len-2;i++)
        {
            if(i==0||(i>0&&nums[i]!=nums[i-1]))
            {
                int p1=i+1,p2=len-1;
                while(p1<p2)
                {
                    if(nums[p1]+nums[p2]<-nums[i])
                    {
                        p1++;
                    }
                    else if(nums[p1]+nums[p2]==-nums[i])
                    {
                        if(p1==i+1){
                            vector<int>vtemp{nums[i],nums[p1],nums[p2]};
                            ret.push_back(vtemp);
                            vtemp.clear();
                        }
                        else if(nums[p1]!=nums[p1-1]){
                            vector<int>vtemp{nums[i],nums[p1],nums[p2]};
                            ret.push_back(vtemp);
                            vtemp.clear();
                        }
                        p1++,p2--;
                    }
                    else p2--;
                }
            }
        }
        return ret;
    }
};

 

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