题目链接
组合
题目描述
注意点
- 1 <= n <= 20
- 1 <= k <= n
- 可以按 任何顺序 返回答案
解答思路
- 使用深度优先遍历根据传入的深度depth寻找相应的组合。因为组合中的元素不能重复,从小到大选择元素,在深度优先遍历时,根据上一次进入dfs选择的元素idx加一作为本次选择的第一个元素,遍历到n为止,以此类推,直到depth等于k就找到了一个组合,上述过程全部遍历完就找到了所有的组合
代码
class Solution {public List<List<Integer>> combine(int n, int k) {List<List<Integer>> res = new ArrayList<>();List<Integer> sonRes = new ArrayList<>();dfs(n, k, 1, 0, res, sonRes);return res;}public void dfs(int n, int k, int idx, int depth, List<List<Integer>> res, List<Integer> sonRes) {if (depth >= k) {res.add(new ArrayList<>(sonRes));return;}for (int i = idx; i <= n; i++) {sonRes.add(i);dfs(n, k, i + 1, depth + 1, res, sonRes);sonRes.removeLast();}}
}
关键点
- 深度优先遍历和回溯的思想