题目描述
给定一个数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。
candidates中的每个数字在每个组合中只能使用一次。
分析
参考自:https://leetcode-cn.com/problems/combination-sum-ii/solution/hui-su-suan-fa-jian-zhi-python-dai-ma-java-dai-m-3/
与39题的区别:
39题:candidates中的数字可以无限制重复被选取
40题:candidates中的每个数字在每个组合中只能使用一次
编码的不同在于下一层递归的起始索引不一样。
39题:从候选数组的当前索引值开始。
40题:从候选数组的当前索引值的下一位开始。
相同之处:解集不能包含重复的组合。
为了使得解集不包含重复的组合,我们先对数组进行升序排序,重复的元素一定不是排好序以后的第一个元素和相同元素的第一个元素。
思路
以target为根节点,依次减去数组中的数字,直到小于0或者等于0,把等于0的结果记录到结果集中:
1. 解集中不能包含重复的组合:对数组进行排序
2. candidates中的每个数字在每个组合中只能使用一次:按顺序依次减去数组中的元素,递归求解即可:遇到0就结算且回溯,遇到负数也回溯。
3. candidates中的数字可以重复:参考47题增加剪枝条件:(i > 0 && candidates[i] == candidates[i - 1] && !visited[i - 1])
或(i > start && candidates[i] == candidates[i - 1] ) 这样不需要传递visited数组