这是力扣上的第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);
}
}
}
结果如下
图1
这道题我用了递归回溯来进行处理,例如下图
图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