英文:
casting does not work on nested list object type and returns empty lists (List<List<Integer>>)
问题
以下是已翻译的内容:
我正在做一些与回溯法相关的LeetCode挑战,特别是:https://leetcode.com/problems/permutations/
在这个问题中,我需要返回类型为 List<List<Integer>>
的结果。然而,如果我将参数接受为 List<Integer>
并在将其添加到主结果中时将其转换为 ArrayList<Integer>
,那么我的 List<List<Integer>>
才会被正确地填充。
代码:
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
bt(new ArrayList<Integer>(), nums);
return result;
}
public void bt(List<Integer> tmp, int[] nums){
if(tmp.size() == nums.length){
result.add(new ArrayList<>(tmp)); // 此处
}else{
// 这里有一些逻辑
}
}
输出:
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
与下面的代码不同,下面的代码接受 ArrayList 作为参数:
代码:
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
bt(new ArrayList<Integer>(), nums);
return result;
}
public void bt(ArrayList<Integer> tmp, int[] nums){
if(tmp.size() == nums.length){
result.add(tmp); // 此处
}else{
... 这里有一些逻辑
}
}
输出:[[],[],[],[],[],[]]
英文:
I'm doing some leetcode challenges related to backtracking, namely:
https://leetcode.com/problems/permutations/
Where I need to return List<List<Integer>>
as the type, however my List<List<Integer>>
only gets populated correctly if I accept List<Integer>
as my parameter and I cast it to ArrayList<Integer>
while I add it in the main result.
Code:
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
bt(new ArrayList<Integer>(), nums);
return result;
}
public void bt(List<Integer> tmp, int[] nums){
if(tmp.size() == nums.length){
result.add(new ArrayList<>(tmp)); // HERE
}else{
// some logic here
}
}
Output:
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
Versus, the code below where i accept ArrayList as the parameter
Code:
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
bt(new ArrayList<Integer>(), nums);
return result;
}
public void bt(ArrayList<Integer> tmp, int[] nums){
if(tmp.size() == nums.length){
result.add(tmp); // HERE
}else{
... some logic here
}
}
Output: [[],[],[],[],[],[]]
答案1
得分: 2
你的代码中没有进行类型转换,而且如果你的方法接受了一个 List<Integer>
或者一个 ArrayList<Integer>
都没有关系。
重要的是在第一个片段中,你将输入列表 tmp
的副本添加到结果中(result.add(new ArrayList<>(tmp))
);然而在第二个片段中,你添加的是指向原始 tmp
列表的引用(result.add(tmp)
)。
在后一种情况下,如果之后你对 tmp
所引用的列表进行了更改,这些更改会反映在 result
列表的所有元素中,因为它们都是指向同一个列表对象的引用。
英文:
There is no casting in your code, and it doesn't matter if your method accepts a List<Integer>
or an ArrayList<Integer>
.
What matters it that in the first snippet you add a copy of the input list tmp
to the result (result.add(new ArrayList<>(tmp))
) while in the second snippet you add a reference to the original tmp
list (result.add(tmp)
).
In the latter case, if you later make changes in the list referenced by tmp
, these changes are reflected in all the elements of the result
list, since they are all references to the same list object.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论