// 这个判断的目的是排除同一层次相同元素的出现。例如:下面例题中有两个1,在第一次递归中不能都出现1,可以的是第一次递归出现1,第二次递归也可以出现一个1
static int x=[](){
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return 0;
}();
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int>> out;
vector<int> list;
sort(candidates.begin(), candidates.end());
combinationSum2(candidates, list, out, target, 0);
return out;
}
void combinationSum2(vector<int>& candidates, vector<int>& list, vector<vector<int>>& out, int target, int start){
if (target < 0)
return;
if (target == 0)
out.push_back(list);
for(int i = start; i < candidates.size(); i++){
// 这里针对第一个题目修改了
// 这里注意了,不要写成i > 0了,这样会把相同的数字全部去掉
if (i > start && candidates[i - 1] == candidates[i]) continue;
// 剪枝,没必要进行下去了
if(target < candidates[i])
return;
list.push_back(candidates[i]);
// start + 1
combinationSum2(candidates, list, out, target - candidates[i], i + 1);
list.pop_back();
}
}
};
LetCode 40. 组合总和 II
最新推荐文章于 2022-01-19 16:55:01 发布