https://leetcode-cn.com/problems/combinations/
回溯的第一题,还是蛮难理解的,需要画图,当然这道题也和DFS有关。
需要注意一个问题:
LinkedList类型的值是按地址调用的,所以在将path将入到result时,需要新建一个地址,不然result会按照原来的地址记录值,原来地址要是变动了值,path也会跟着变动。
解决办法:创建新的地址保存值new LinkedList<>(path);
//传入参数:范围(n+1 ,k, 遍历开始位置startIndex)
//终止条件:当path的长度为k,加入到result,返回
// 处理逻辑:
// for(从startIndex开始到末尾){
// path.add(i);
// backtracking(n,k, i + 1);
// path.remove(i);
// }
class Solution {
//设置全局变量
LinkedList<Integer> path = new LinkedList<>();
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n + 1, k, 1);
return result;
}
public void backtracking(int n, int k, int startIndex){
if(path.size() == k){
result.add(new ArrayList(path));//创建新的内存空间
// System.out.println("result:" + result);
return;
}
for(int i = startIndex; i < n; i++){
// System.out.println("i: " + i);
path.add(i);
backtracking(n, k, i + 1);
// System.out.println("path: " + path);
path.removeLast(); //回溯
}
}
}