力扣:组合java
流程:
回溯三部曲
参数和返回值:返回值为空,参数为范围数n和组合数k,和开始值startindex
结束条件**:path的大小为k时,记录记过进结果集中**并返回上一层。
单层递归逻辑:
for循环定义一个i赋初值为startindex条件是i<=n(遍历整个范围n),每次循环i++
循环内部,节点处理:对当前i输入到path中。
调用递归函数:参数为n,k,i+1.(例如,使得下一层在取得1后,从2到n中取值组合)。
进行回溯操作:对path的最后一位输出,(也就是取1之后将以弹出,以便下一次取2,以此类推)
代码
class Solution {
List<List<Integer>> result = new ArrayList<>();//结果集
LinkedList<Integer> path = new LinkedList<>();//取值路径
public List<List<Integer>> combine(int n, int k) {//主函数
zuhe(n,k,1);//调用递归函数,
return result;
}
public void zuhe(int n,int k,int startindex){//递归函数
if(path.size() == k){
//结束条件,路径内元素等于输出的元素数量时,输出到结果集中
result.add(new ArrayList<>(path));
return;//返回上一层
}
for(int i = startindex; i<=n;i++){
//循环遍历第一次取1-n所有元素
path.offer(i);//节点操作,对当前值i加入进path中
zuhe(n,k,i+1);//递归调用剩下的元素与当前i的组合
path.removeLast();//回溯操作,对path去出输入的i
}
}
}