一、题目
给定两个整数 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]]
提示:
1 <= n <= 20
1 <= k <= n
二、思路解析
这道题还是用递归来解决,因为每一层都是求相同的子问题。
而这道题的代码实现,其实并不难理解。
我们用一个 path 数组,来记录我们所遍历的元素。
剪枝则是当前位置之后的所有元素放入组合也不能满足组合中存在 k 个元素时,直接返回即可。
递归完的恢复现场操作,则是移除 path 数组的最后一个元素,以确保下次递归时能够回到上一层。
三、完整代码
class Solution {
List<List<Integer>> ret;
List<Integer> path;
int n , k;
public List<List<Integer>> combine(int _n, int _k) {
n = _n;
k = _k;
ret = new ArrayList<>();
path = new ArrayList<>();
dfs(1);
return ret;
}
public void dfs(int start){
// 剪枝
if(path.size() == k){
ret.add(new ArrayList<>(path));
return;
}
for(int i = start ; i <= n ; i ++){
path.add(i);
dfs(i + 1);
path.remove(path.size() - 1); // 恢复现场
}
}
}
以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!