难点在于不能有重复。
开始的思路是先两两求和,然后对得到的新序列求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; } };