Problem description
https://leetcode-cn.com/problems/combination-sum/
Solution
题目中关键点:
- 每个数字可以被重复取
- 组合的和为指定值
做回溯题,需要画出递归树进行分析,参考该链接递归树.
剪枝的情况
- 对数组进行排序,排序的目的是之后寻找时可以方便剪枝,当 sum+cur > target 时,后面比 cur 还大的数就不需要考虑了。
- 当 sum > target 时 或者遍历完数组时,sum < target, 就直接返回
深搜有两种情况
- 包含自己,毕竟自己也可以重复添加进组合中
- 不包含自己,访问下一元素前需要将当前元素从 Deque 中去除。
使用 Dequeue 便于移除队尾元素。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import java.util.* class Solution { fun combinationSum(candidates: IntArray, target: Int): List<List<Int>> { val res = mutableListOf<List<Int>>() Arrays.sort(candidates) fun DFS(cur: Int, sum: Int, lists: Deque<Int>) { if (cur == candidates.size || sum > target) { return } if (sum == target) { val list = lists.toList() res.add(list) return } if (sum + candidates[cur] > target) { return } lists.add(candidates[cur]) DFS(cur, sum + candidates[cur], lists) lists.removeLast() DFS(cur + 1, sum, lists) } DFS(0, 0, ArrayDeque()) return res } }
|