前言
相信看到这篇文章的
大部分都是刷leetcode发现的疑问
这部分知识主要涉及了浅拷贝和深拷贝
具体可看我这篇文章
浅拷贝和深拷贝的深度理解
1. 结论
res.add(list)
为浅拷贝,后续list内容的变化会导致res的变化,在原来地址改变数据,内容肯定会被改变res.add(new ArrayList(list))
为深拷贝,对象中开辟一个新地址,存放的内容为list链表,所以后续不会被影响。
2. 测试案例
通过测试案例对比两个代码模块的不同
2.1 浅拷贝
package ceshi;
import java.util.ArrayList;
import java.util.List;
public class ceshi {
public static void main(String []args) {
ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
List<List> result = new ArrayList<List>();
result.add(list);
System.out.println(result);
list.add(4);
result.add(new ArrayList<>(list));
System.out.println(result);
}
}
结果如下
2.2 深拷贝
package ceshi;
import java.util.ArrayList;
import java.util.List;
public class ceshi {
public static void main(String []args) {
ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
List<List> result = new ArrayList<List>();
result.add(new ArrayList<>(list));
System.out.println(result);
list.add(4);
result.add(new ArrayList<>(list));
System.out.println(result);
}
}
结果如下
3. leetcode实战案例
组合总和
代码结构就有用到这部分代码
只能用深拷贝,浅拷贝就会出错
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
List<Integer> combine = new ArrayList<Integer>();
dfs(candidates, target, ans, combine, 0);
return ans;
}
public void dfs(int[] candidates, int target, List<List<Integer>> ans, List<Integer> combine, int idx) {
if (idx == candidates.length) {
return;
}
if (target == 0) {
ans.add(new ArrayList<Integer>(combine));
return;
}
// 直接跳过
dfs(candidates, target, ans, combine, idx + 1);
// 选择当前数
if (target - candidates[idx] >= 0) {
combine.add(candidates[idx]);
dfs(candidates, target - candidates[idx], ans, combine, idx);
combine.remove(combine.size() - 1);
}
}
}