(1)由于a<=b<=c 使用排序,将数组从下到大排序,这样递归的结果永远都是啊a<=b<=c;
(2)递归+回溯+剪支
class Solution {
public:
void gen(int i,set<vector<int>> &res,vector<int> &temp,vector<int> &num,int sum,int target,vector<vector<int>> &result){
//剪支
if(i>=num.size()||temp.size()>3) return;
if(temp.size()==3&&sum!=target) return;
sum+=num[i];
temp.push_back(num[i]);
//边界条件
if(temp.size()==3&&sum==target&&res.find(temp)==res.end()){
result.push_back(temp);
res.insert(temp);
//return;
}
gen(i+1,res,temp,num,sum,target,result);
//回溯
sum-=num[i];
temp.pop_back();
gen(i+1,res,temp,num,sum,target,result);
}
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>> result;
set<vector<int>> res;
if(num.size()==0) return result;
vector<int> temp;
//排序
sort(num.begin(),num.end());
gen(0,res,temp,num,0,0,result);
return result;
}
};
京公网安备 11010502036488号