LeetCode 18. 4Sum

难点在于不能有重复。

开始的思路是先两两求和,然后对得到的新序列求2Sum,但是很难排重。本想利用set<set<int>>排重,结果因为stl内部实现机制,应该是做不到。

可行的思路是,外层暴力fix前两个数,内层一个循环固定后两个数。还是注意排重。

 

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& n, int target) {
        vector<vector<int>> ans;
        int l,r,len=n.size();
        vector<int> temp;
        sort(n.begin(),n.end());
        for(int i=0;i<len-3/*&&n[i]*4<=target*/;){
            for(int j=i+1;j<len-2;){
                l=j+1;r=len-1;
                while(l<r){
                    if(n[i]+n[j]+n[l]+n[r]>target) r--;
                    else if(n[i]+n[j]+n[l]+n[r]<target) l++;
                    else {
                        temp.push_back(n[i]);
                        temp.push_back(n[j]);
                        temp.push_back(n[l]);
                        temp.push_back(n[r]);
                        ans.push_back(temp);
                        temp.clear();
                        l++;
                        while(n[l]==n[l-1]) l++;
                    }
                }//else
                j++;
                while(n[j]==n[j-1]) j++;
            }//for j
            i++;
            while(n[i]==n[i-1]) i++;
        }//for i
        return ans;
    }
};

 

posted @ 2018-08-09 22:12  Travelller  阅读(90)  评论(0编辑  收藏  举报