吸取了3sum用回溯法求解会超时的教训,本题采纳“双指针”扩广法:
class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int>> ans;
if(num.size()<4)
return ans;
sort(num.begin(),num.end());//sort排序,便于剔除重复解答
vector<int> flag;
int i=0;
while(i<num.size()-3)//4 sum
{
int j=i+1;
while(j<num.size()-2) //3 sum
{
int begin=j+1,end=num.size()-1;
while(begin<end) //2 sum
{
int temp=num[i]+num[j]+num[begin]+num[end];
if(temp==target)
{
flag.push_back(num[i]);
flag.push_back(num[j]);
flag.push_back(num[begin]);
flag.push_back(num[end]);
ans.push_back(flag);
flag.clear();
begin++;
end--;
while(num[begin]==num[begin-1])
begin++; //剔除重复解答
while(num[end]==num[end+1])
end++;
}
else
{
if(temp<target)
begin++;
else
end--;
}
}
j++;
while(num[j]==num[j-1])
j++;
}
i++;
while(num[i]==num[i-1])
i++;
}
return ans;
}
};