在我学习回溯算法的时候,找到了这道经典的题开始做,参考了不少大佬的理解,然后自己琢磨出了比较简陋的解答。
关键还是在于理解回溯:
(回溯模板):
void backtracking(参数){//个人觉得参数这部分因人而异,用到啥就写啥
if(终止条件){//这里相当于二叉树的叶子结点,相当于收割果实的条件
收集结果,比如符合条件的组合
然后return,回到上一层
}
for(遍历集合里的元素,遍历完它){
处理节点,比如1,2,3,4
递归开始:backtracking(参数)
递归会改变节点后面跟的元素,回溯,用于继续递归
}
}
题目:给定两个整数 n 和 k
返回 1 … n 中所有可能的 k 个数的组合。
组合:无序->相当于高中的
排列:有序->相当于高中的
下面是代码实现
public class Solution {
public List<Integer>path=new ArrayList<>();
public List<List<Integer>>result=new ArrayList<List<Integer>>();
public List<List<Integer>> combine(int n, int k) { {
backstracking(n,k,1);
return result;
}
}
public void backstracking(int n,int k,int startIndex) {
if(path.size()==k) {
result.add(new ArrayList(path));
return ;
}
for(int i=startIndex;i<=n;i++) {
path.add(i);
backstracking(n,k,i+1);
path.remove(path.size()-1);
}
}
}