个人思路总结:
回溯+集合(set)去重。
此题和第39题的区别主要是:此题数组中可能会有重复元素,因此我们要先对数组进行排序,如果不排序的话可能会存在[1,7]和[7,1]都满足题目要求。排序后就会出现两个[1,7]的情况,因此我们还需要对最后的结果进行去重。
set去重的主要代码为:
set<vector<int>> result;
result.insert(tmp);
return vector<vector<int>>(result.begin(),result.end());
代码如下:
class Solution {
private:
set<vector<int>> result; //建立set集合
vector<int> tmp;
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
find(candidates,target,0,candidates.size()-1);
return vector<vector<int>>(result.begin(),result.end()); //返回去重后的结果
}
void find(vector<int>& candidates, int target, int start, int end)
{
if(start>end+1||target<0)
return;
if(target==0)
result.insert(tmp); //将结果嵌入
else
{
for(int i=start;i<=end;i++)
{
tmp.push_back(candidates[i]);
find(candidates,target-candidates[i],i+1,end);
tmp.pop_back();
}
}
}
};