代码随想录算法训练营第二十四天|77. 组合
77. 组合
问题简述:求出1~n的所有k个组合。
思考:因为之前做求出所有路径,那时候回溯理解了很久,现在看这个还算有点感觉。回溯的基本思路就是:
- 确定传入值和返回值。
- 确定终止条件。
- 进行for循环递归回溯。
算法思路:定义一个startIndex作为每次循环的起始位置,path为每个结果的路径。在path中加入元素,再进行递归,递归的startIndex加1即为加入当前元素后面的元素,保证path中不再重复。递归完成后再移除上一步加入的元素。当path元素个数为k时,将path加入lists并返回。同时在进行for循环时考虑到剪枝,i最大只能为n - (k - path.size()) + 1
,当大于这个数时,结果不再成立。
import java.util.ArrayList;
import java.util.List;
class Solution {
List<List<Integer>> lists = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n, k, 1);
return lists;
}
public void backtracking(int n,int k,int startIndex){
//确定终止条件
if (path.size() == k){
//这里注意需要新创建一个ArrayList将path的值放入lists,不可以直接将path放入
lists.add(new ArrayList<>(path));
return;
}
//进行循环并回溯,同时进行剪枝
for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) {
path.add(i);
backtracking(n, k, i + 1);
path.remove(path.size() - 1);
}
}
}
感想
想卖点玩具