这个问题过去一年多了,我也是今天才遇到这个问题,查找资料的时候百度到这个问题,我已经解决,现在写下来,为后来者铺路!
我的问题来源于leetcode 题,使用回溯法,代码中有一段和楼主遇到的问题一模一样,最后竟然输出为空。
贴一下我的代码
class Solution {
List<List<Integer>> list = new ArrayList<List<Integer>>();
boolean[] used;
public List<List<Integer>> permute(int[] nums) {
if(nums == null || nums.length == 0){
return list;
}
used = new boolean[nums.length];
ArrayList<Integer> p = new ArrayList<Integer>();
generatePermutation(nums,0,p);
return list;
}
//p中保存有index个元素的全排列。这个方法的目的是向这个排列的末尾添加第index+1个元素,使p成为有index+1个元素的全排列
public void generatePermutation(int[] nums,int index,ArrayList<Integer> p){
if(index == nums.length ){
ArrayList<Integer> tem = new ArrayList<>();
tem.addAll(p);
list.add(tem);
return;
}
for(int i = 0 ; i < nums.length ; i++){
if(!used[i]){
p.add(nums[i]);
used[i] = true;
generatePermutation(nums,index+1,p);
p.remove(p.size()-1);
used[i] = false;
}
}
return;
}
}
在这个部分:
if(index == nums.length ){
ArrayList<Integer> tem = new ArrayList<>();
tem.addAll(p);
list.add(tem);
return;
}
改为
if(index == nums.length ){
list.add(p);
return;
}
输出就为空了。原因是:我们add(p),也就是楼主这里的add(path),我们这是将path的地址给add进去了,并没有将真正的列表add进热resultlist,这样导致的结果就是 当你的path中的值改变后,resultlist中也随之改变,楼主不出意外的话,你最后的path变为空了,所以最后输出全空。贴一段简单代码自己运行感受下:
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
List<List<Integer>> res = new ArrayList<>();
System.out.println(res);
res.add(list);
list.add(50);
res.add(list);
System.out.println(res+"发现两个元素竟然一样");