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

 

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