Leetcode 113 Path Sum II的问题解决方案如下:
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
dfs(root, targetSum, new ArrayList<>());
return res;
}
private void dfs (TreeNode node, int targetSum, List<Integer> list) {
if (node == null) return;
list.add(node.val);
if (targetSum == node.val && node.left == null && node.right == null) {
** res.add(new ArrayList<>(list));**
}else {
if (node.left != null) dfs(node.left, targetSum - node.val, list);
if (node.right != null) dfs(node.right, targetSum - node.val, list);
}
list.remove(list.size() - 1);
}
}
例如,当我将res.add(new ArrayList<>(list))
更改为res.add(list)
时,我得到的res为[[],[]]
,它应该像这样[[5,4,11,2],[5,8,4,5]]
。
为什么不能直接使用res.add(list);
?列表由ArrayList<>()
定义。
我检查了相关的答案,知道有两种方法来定义一个二维数组:
List<List<Integer>> res = new ArrayList<List<Integer>>();
List<List<Integer>> res = new ArrayList<>();
我知道List
是一个接口,而ArrayList
是一个Collection
类。我还是很困惑。
1条答案
按热度按时间t2a7ltrp1#
res.add(new ArrayList<>(list))
更改为res.add(list)
时,我得到的res为[[],[]]
,它应该像这样[[5,4,11,2],[5,8,4,5]]
。..."*这是因为 list 是一个对象,所以它在这里仍然会受到影响,
还有这里
这可能会让人感到困惑,因为你会想象一个新的对象值会被传递。
通过使用 *
res.add(new ArrayList<>(list))
*,您正在创建 list 的新副本-因此,它不会受到影响。下面是特定的 ArrayList 构造函数方法的源代码。
List
是一个接口,而ArrayList
是一个Collection
类。我仍然对此感到困惑。"*你说得对虽然,List 只是 Collections 框架中的一个接口。
从技术上讲,它仍然是一个集合。
下面是 List JavaDoc。List (Java SE 20 & JDK 20)。
下面是 Collections Framework 的JavaDoc。
最后,这里是一个关于 Collections Framework 的Java教程。