40. 组合总和 II
给定一个数组
candidates
和一个目标数target
,找出candidates
中所有可以使数字和为target
的组合。
candidates
中的每个数字在每个组合中只能使用一次。说明:
- 所有数字(包括目标数)都是正整数。
- 解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8, 所求解集为: [ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5, 所求解集为: [ [1,2,2], [5] ]
解法一:
//时间复杂度O(?), 空间复杂度O(?)
class Solution {
public:
void DFS(vector<int>& candidates, int target, vector<vector<int>>& res, vector<int>& cur, int left) {
if(target < 0) return;
if(target == 0) {
res.push_back(cur);
return;
}
for(int i = left; i < candidates.size(); i++) {
if(i > left && candidates[i - 1] == candidates[i]) continue;
cur.push_back(candidates[i]);
DFS(candidates, target - candidates[i], res, cur, i + 1);
cur.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
vector<vector<int>> res;
vector<int> cur;
DFS(candidates, target, res, cur, 0);
return res;
}
};
思路:
和39题思路一样,不同的是对于每一个子结点,不再尝试遍历所有candidates了,而是不重复地挑选。
去重的思路很关键,在每一层里,出现过的candidat跳过即可。
2019/09/29 00:53