gpt4 book ai didi

java - Arraylist 没有正确地递归更新

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:06:10 24 4
gpt4 key购买 nike

下面是我的函数,它给出了给定数组中的元素总和为特定目标的所有可能性。我能够打印列表,但是结果列表没有得到更新。

public List<List<Integer>> helper(List<List<Integer>> res, int[] c, int l, int h, int target, List<Integer> temp){
if(target == 0){
res.add(temp);
System.out.println(temp);
return res;
}
if(target < c[l]){
return res;
}
for(int i = l; i <=h; i++){
temp.add(c[i]);
res = helper(res, c,i,h,target-c[i], temp);
temp.remove(temp.size()-1);
}
return res;
}

res 最后是空数组列表的数组列表,但第 5 行正确打印了临时数组列表。

函数调用如下。

List<List<Integer>> res = new ArrayList<List<Integer>>();
List<Integer> temp = new ArrayList<Integer>();
res = helper(res,candidates, 0, candidates.length-1, target, temp);

例子:给定数组 = [1,2,3],目标 = 6

标准输出:

[1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 2]
[1, 1, 1, 3]
[1, 1, 2, 2]
[1, 2, 3]
[2, 2, 2]
[3, 3]

res is [[],[],[],[],[],[],[]]

最佳答案

这是针对按值传递问题的标准按引用传递

您正在将 temp 的引用添加到 res 对象,因此每当 temp 的值更改时(在 for loop 在你的程序中),它也会改变 res 中实例的值,所以当所有元素都从 temp 中移除时,列表变成空,然后它将 res 中的所有值更改为空列表。

如下更改您的辅助方法,如果有条件,它应该可以工作:

if(target == 0){
ArrayList<Integer> copy = new ArrayList<>(temp);
res.add(copy);
return res;
}

解释

我们不是将 temp 的引用添加到 res,而是创建 temp 的简单副本,然后将其添加到 res.

这可以防止值被新的对象值覆盖。

关于java - Arraylist 没有正确地递归更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54833035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com