求一个未排序的序列,其中几个数的和为target,数字不能重复。
使用的方法和039差不多,具体差别在代码中展示。
class Solution {
public:
void get_ans(int ans,vector<int>& nums,vector<vector<int>>&an,vector<int> get_ss,int limit){
if(ans==0){an.push_back(get_ss);return ;}
int get_aa=-1;
for(int ii=0;ii<nums.size();ii++){
if(ans-nums[ii]<0||ii<=limit)continue;//由于只能使用一次,所以改成<=
if(nums[ii]==get_aa)continue;
get_ss.push_back(nums[ii]);
get_ans(ans-nums[ii],nums,an,get_ss,ii);
get_aa=*(get_ss.end()-1);//需要判断是不是在同一个位置上出现相同的数字,导致结果重复,比如[1,1],target=2,结果只能是[1],而不是[1],[1]
get_ss.erase(get_ss.end()-1);
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
vector<vector<int>>yy;
vector<int>uu;
get_ans(target,candidates,yy,uu,-1);
return yy;
}
};