Leetcode.40 组合总和 II
给定一个候选人编号的集合 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
示例 1:
输入: candidates = `[10,1,2,7,6,1,5]`, target = `8`,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]
提示:
1 <= candidates.length <= 100
1 <= candidates[i] <= 50
1 <= target <= 30
思路:
用 dfs(i,left) 来回溯,设当前枚举到 *candidates[i]*,剩余要选的元素之和为 left,按照选或不选分类讨论:
不选:递归到 *dfs(i+1,left)*。
选:递归到 *dfs(i,left−candidates[i])*。注意 i 不变,表示在下次递归中可以继续选 *candidates[i]*。
注:这个思路类似 完全背包。
如果递归中发现 left=0 则说明找到了一个合法组合,复制一份 path 加入答案。
递归边界:如果 i=n-1 或者 left<0 则返回。
递归入口:*dfs(0,target)*。
1 | func combinationSum(candidates []int, target int) [][]int { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Bishop!
评论
GitalkValine