LeetCode 40.组合总和II
组合总和II
给定一个候选人编号的集合 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的每个数字在每个组合中只能使用 一次 。
**注意:**解集不能包含重复的组合。
输入: candidates = [10,1,2,7,6,1,5], target = 8, |
方法:回溯
算法思路:
与39.组合总和不同的是,本题candidates
的元素是有重复的,每个数字在每个组合中只能使用一次。所以,我们需要对同一树层上使用过的元素去重,同一树枝上的不需要去重。
-
确定递归函数参数
除39.组合总和设置的参数外,还需加一个boolean型数组
used
,用来记录同一树层上的元素是否使用过。 -
确定递归终止条件
当
sum
大于等于target
时终止递归,当sum
等于target
时,将path
添加到result
中。剪枝优化可参考39.组合总和,先将candidates
数组排序,当sum + candidates[i] > target
时,后续的数就不需要遍历了,直接break
。 -
单层搜索的过程
for
循环从startIndex
开始,搜索candidates
数组,若遇到重复的,则直接continue
跳过。if(i > startIndex && candidates[i] == candidates[i - 1]){
continue;
}
代码实现:
class Solution { |
参考
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Abacteria的学习小站!