题目描述
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例1
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
示例2
输入: n = 1, k = 1
输出: [[1]]
思路
与DFS合集第一题的思路几乎一样,建议先看第一篇:DFS合集–1.所有子集
对于数组中的每个数字,只有两种情况:
- 不将它加入集合。那么可以直接去遍历下一个数字,而遍历每个数字的操作是一样的,那么就递归调用。
- 将它加入集合。首先将这个它加入集合,然后递归下一个数字,递归结束之后,还要回溯,也就是将这个数字取出来,回到最开始的状态。
这道题和上一道题不同点在于结束条件,这个的条件是集合里面一共是k和元素,所以只需要改一下结束条件即可。
代码
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> result = new LinkedList();
LinkedList<Integer> subset = new LinkedList();
dfs(n, k, 0, 1, subset, result);
return result;
}
private void dfs(int n, int k, int sum, int index, LinkedList<Integer> subset, List<List<Integer>> result){
if(sum == k){
result.add(new LinkedList(subset));
}else if(index > n){
return;
}else if(sum < k){
dfs(n, k, sum, index + 1, subset, result);
subset.add(index);
dfs(n, k, sum + 1, index + 1, subset, result);
subset.removeLast();
}
}
}