java嵌套集合的一个小坑,list.add(list)的问题

这是力扣上的第77题,题目描述如下

77. 组合

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
示例 2:

输入:n = 1, k = 1
输出:[[1]]

 

先上代码

public class LeetCode_77_1 {
public static void main(String[] args) {

List<List<Integer>> combine = combine(4, 2);

}
public static List<List<Integer>> combine(int n, int k) {
List<List<Integer>> list = new ArrayList<>();
List<Integer> app = new ArrayList<>();

backtracking(list,app,n,k,1);


System.out.println("list集合结果"+list.toString());
return list;
}
public static void backtracking(List<List<Integer>> list,List<Integer> app,int n,int k,int index){
if(app.size()+(n-index+1)<k) return;
if(app.size()==k){
list.add(app);
System.out.println("app.size()==k app:"+app);
System.out.println("app.size()==k list:"+list);
return;
}
for (int i=index;i<=n;i++){
app.add(i);
backtracking(list,app,n,k,i+1);
app.remove(app.size()-1);
}
}
}

结果如下

java嵌套集合的一个小坑,list.add(list)的问题

 

 

                                                         图1

这道题我用了递归回溯来进行处理,例如下图

java嵌套集合的一个小坑,list.add(list)的问题

 

                      图2

写完之后查看结果,个数是对应上,但是值为空值

查看代码调用输出,app的结果是正常,但是list结果跟着app结果进行全部修改

list.add(app)传入数据时,我认为是把两个数组的值传进去了,但实际list输出之后才发现其实list存的是app的地址

就像List:{app.hashCode(),app.hashCode(),app.hashCode(),app.hashCode(),app.hashCode(),app.hashCode()}

每次都是吧app的地址传进去了,app修改之后,list内部也是引用app的地址获取到的数据就跟图1结果一样

因此如果添加嵌套list时,需使用list.add(new ArratList<T>(app))才可以将数据真正的存入list

java嵌套集合的一个小坑,list.add(list)的问题

上一篇:python中OrderedDic


下一篇:数组合并去重