一开始我低估了这题的难度,以为用贪心算法或者上一题的解法就能做出来TT后来发现很多做法会得出重复解,只能另辟蹊径了...!
想出来的解法是先将candidates中重复的元素提出来用数组记录重复的个数,然后将重复的元素去掉,接着用原来(上一题)的方法依次遍历元素,如果能取该元素就继续遍历该元素,不能取就全部跳过,最终可以得到正确解。
cpp
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target){
vector<vector<int>> v;
vector<int> vec;
sort(candidates.begin(),candidates.end());
vector<int> g(candidates[candidates.size()-1]+1);
int u=0;
for(int i=candidates.size()-1;i>=0;i--){
while(i>=1&&candidates[i]==candidates[i-1]){
i--;
g[candidates[i]]++;
}
}
for(int i=0;i<g.size();i++) cout<<g[i]<<" ";
candidates.erase(unique(candidates.begin(), candidates.end()), candidates.end());
hs(candidates,target,v,vec,candidates.size()-1,g);
return v;
}
void hs(vector<int> candidates, int target,vector<vector<int>>& v,vector<int> vec,int x,vector<int> g){
while(x>1&&candidates[x]==candidates[x-1]) x--;
for(;x>=0;x--){
if(candidates[x]<target){
vec.push_back(candidates[x]);
if(g[candidates[x]]>0){
g[candidates[x]]--;
hs(candidates,target-candidates[x],v,vec,x,g);
g[candidates[x]]++;
}
else hs(candidates,target-candidates[x],v,vec,x-1,g);
vec.pop_back();
}
else if(candidates[x]==target){
vec.push_back(candidates[x]);
v.push_back(vec);
vec.pop_back();
}
}
}
};