本题源自leetcode 40
------------------------------------------------------------
思路: 用回溯法
1 对数组排序
2 递归遍历
3 在递归中去重,即用一个pre变量
代码
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int>> res;
int n = candidates.size();
if(n == 0)
return res;
vector<int> path;
sort(candidates.begin(),candidates.end());
backPath(candidates,res,path,target,0);
return res;
}
void backPath(vector<int>& nums,vector<vector<int>>& res,vector<int>& path,int target,int start){
if(target == 0){
res.push_back(path);
return ;
}
int pre = -1; //去重复
for(int i = start; i < nums.size(); i++){
if(nums[i] == pre)
continue;
if(nums[i] > target) //减少调用次数,不加这一句会超时
return;
pre = nums[i];
path.push_back(nums[i]);
backPath(nums,res,path,target - nums[i],i+1);
path.pop_back();
}
}