Java ArrayList初始化
我一直在试图理解下面的代码,它使用深度优先搜索(DFS)打印出由数字[1..n]组成的长度k的所有唯一组合 请参阅专用dfs函数中注释为“怀疑”的行Java ArrayList初始化,java,arraylist,function-parameter,Java,Arraylist,Function Parameter,我一直在试图理解下面的代码,它使用深度优先搜索(DFS)打印出由数字[1..n]组成的长度k的所有唯一组合 请参阅专用dfs函数中注释为“怀疑”的行 public ArrayList<ArrayList<Integer>> combine(int n, int k) { ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>()
public ArrayList<ArrayList<Integer>> combine(int n, int k) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if (n <= 0 || n < k)
return result;
ArrayList<Integer> item = new ArrayList<Integer>();
dfs(n, k, 1, item, result);
return result;
}
private void dfs(int n, int k, int start, ArrayList<Integer> item,
ArrayList<ArrayList<Integer>> res) {
if (item.size() == k) {
res.add(new ArrayList<Integer>(item)); /*doubt*/
return;
}
for (int i = start; i <= n; i++) {
item.add(i);
dfs(n, k, i + 1, item, res);
item.remove(item.size() - 1);
}
}
公共数组列表组合(int n,int k){
ArrayList结果=新建ArrayList();
如果(n那么你的问题涉及这两种选择:
// works
res.add(new ArrayList<Integer>(item));
// won't work, results in empty lists
res.add(item);
添加到项中的每个元素以后都将被删除。这就是为什么在没有克隆步骤的情况下会出现空列表。没有克隆,不仅会得到一个空列表列表,而且所有空列表实际上都是在第一次调用dfs
之前在combine
中创建的相同原始ArrayList
>.这是因为item.remove(item.size()-1);
正在修改您刚刚添加到结果列表中的同一列表。因此,它总是会删除所有项目。您的解决方案实际上是复制项目列表并将其存储在结果列表中。没有人引用该列表,因此它不会被修改。因为您正在修改由i指向的同一列表tem
在for循环中。这也将修改存储在res
列表中的引用的列表。
for (int i = start; i <= n; i++) {
item.add(i);
dfs(n, k, i + 1, item, res);
item.remove(item.size() - 1);
}