下面是在 Java 中使用迭代查找子集的程序。
问题:当仅尝试更新
ans
时,ansCopy
也会使用新值进行更新。也许,两个 ArrayList ans
和 ansCopy
碰巧共享相同的地址。
需求:帮忙调试!!
public static ArrayList<ArrayList<Integer> > subsetUsingIteration2(int[] a) {
ArrayList<ArrayList<Integer> > ans=new ArrayList<ArrayList<Integer> >();
ans.add(new ArrayList<Integer>());
// ArrayList<ArrayList<Integer> > ans={{}};
ArrayList<ArrayList<Integer> > ansCopy=new ArrayList<ArrayList<Integer> >();
// ArrayList<Integer> ansCopy={};
for(int i=0; i<a.length; i++) {
ansCopy.addAll(ans);
for(int j=0; j<ansCopy.size(); j++)
ansCopy.get(j).add(a[i]);
ans.addAll(ansCopy);
ansCopy.clear();
}
return ans;
}
尝试找到这两个变量的内存地址。但找不到他们。
在每个步骤中,您应该复制
ans
中的每个列表,从数组 a
附加一个新数字,然后再次将该新列表添加到 ans
。
你已经正确开始了。但是,最好使用 List 而不是数组列表作为引用类型。
List<List<Integer> > ans=new ArrayList<>();
ans.add(new ArrayList<>());
并且,在 for 循环中:
从已填充的
ans
复制每个元素。
从数组
a
添加新元素,这基本上是一个新的子集。
将
inner
表示的新子集添加到 ans
for (int elem : a) {
int n = ans.size();
for (int i = 0; i < n; i++) {
// copy each element from the `ans` which is already populated.
List<Integer> inner = new ArrayList<>(ans.get(i));
// Add the new elment from array `a` which is basically a new
// subset
inner.add(elem);
// Add the new subset represented by `inner` to the ans
ans.add(inner);
}
}