第18行为什么在新建的一维数组ArrayList的小括号里写填一维数组?
但写成res.add(output);的话就错了.
这两写法有啥区别吗?
无论在力扣上,还是直接jdk编译都是能通过的。
这个操作是可以通过编译运行的。没有任何问题
public void t(List<Integer> obj,List<List<Integer>> res){
res.add(obj);
}
应该都可以。new的作用是重新初始化,分配内存空间。
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> output = new ArrayList<>();
for(int num : nums){
output.add(num);
}
int n = nums.length;
backtrack(n, output, res , 0);
return res;
}
public void backtrack(int n, List<Integer> output, List<List<Integer>> res, int first){
if(first == n){
res.add(new ArrayList<>(output));
}
for(int i = first; i < n; i++){
Collections.swap(output, first, i);
backtrack(n ,output , res, first+1);
Collections.swap(output, first, i); //回溯法:紧跟递归调用的后面写撤销操作
}
}
}
没错的。如果IDE报错,可以试试清下缓存重启电脑
如果直接用 res.add(output) ,那下面的 Collections.swap(output, first, i) 操作就会影响到res中的结果,重新new ArrayList<>(output)对象,即时下面对output对象进行了操作,也不会影响到res.add(new ArrayList<>(output))添加到res中的对象。
并不是简单的语法问题
下面是演示
List<Integer> originList = Stream.of(1, 2, 3).collect(Collectors.toList());
System.out.println("原始数组为:" + originList);
List<Integer> integerList = new ArrayList<>(originList);
Collections.swap(originList, 1, 2);
System.out.println("swap后,原始数组:" + originList);
System.out.println("swap后,拷贝数组:" + integerList);
结果如下: