题干
给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
思路
主要考察点:回溯算法
- 递归函数的返回值以及参数:返回值通常为void,需要参数来标定位置,防止出现组合
- 回溯终止的条件:当path的长度=k
- 搜索过程:从标定位置遍历到n
解题 (未剪枝版本)
class Solution {
List<List<Integer>> res = new ArrayList<List<Integer>>();
List<Integer> path = new ArrayList<Integer>();
public List<List<Integer>> combine(int n, int k) {
backtrace(n,k,1);
return res;
}
void backtrace(int n,int k,int startIndex){
if(path.size()==k){
res.add(new ArrayList<Integer>(path));
return;
}
for(int i = startIndex;i<=n;i++){
path.add(i);
backtrace(n,k,i+1);
path.remove(path.size()-1);
}
}
}
解题(剪枝版本)
// 待续
最后总结一下回溯算法的模板
// 可以在主函数之外,作为类的全局变量
void backtrace(全局){
if(终止条件){
// 收集结果
return;
}
for(集合元素){
// 处理节点
// 递归函数
// 撤销操作
}
return;
}