使用语言:Java
leetcode 77.组合
在写这道题目的时候,遇到了一个问题
在backtracking()函数的终止条件中,如果以resList.add(path)的形式添加数据,会发现resList的结果都是空数组,但是如果以resList.add(new ArrayList<>(path))的形式添加数据,则结果正常
经查阅,发现是因为path的类型是List,为引用类型,如果以resList.add(path)的形式添加数据,则在后续更改path的结果时,也会改变之前添加的path,因为回溯的最终是把path的所有数据都移除了,所以path为空
详细代码如下:
class Solution {
List<List<Integer>> resList = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n,k,1);
return resList;
}
public void backtracking(int n,int k,int startIndex) {
if (path.size() == k) {
resList.add(new ArrayList<>(path));
return;
}
//第1次回溯确定第1个数
//第2次回溯确定第2个数...
for (int i = startIndex; i <= n-(k-path.size())+1; i++) {
path.add(i);
backtracking(n,k,i+1);
path.removeLast();
}
}
}