public class Solution {
public List<List<Integer>> permute(int[] nums) {
List<Integer> numList = new LinkedList<Integer>();
for(int i=0;i<nums.length;i++){
numList.add(nums[i]);
}
List<List<Integer>> result = partition(numList);
return result;
}
private List<List<Integer>> partition(List<Integer> list){
List<List<Integer>> res = new LinkedList<List<Integer>>();
if(list.size()==1){
res.add(new ArrayList<Integer>(list));
return res;
}
for(int i=0;i<list.size();i++){
int tmp = list.get(i);
list.remove(i);
List<List<Integer>> temp = partition(list);
list.add(i,tmp);
for(int j=0;j<temp.size();j++){
List<Integer> aa = temp.get(j);
aa.add(0,tmp);
res.add(new ArrayList<Integer>(aa));
}
}
return res;
}
}
本题初看之下是一个非常简单的递归问题。但是为什么会卡这么久呢,一个很重要的原因就是在对引用进行操作的时候某一个变量被反复使用,但是比如
for(int j=0;j<temp.size();j++){
List<Integer> aa = temp.get(j);
aa.add(0,tmp);
res.add(new ArrayList<Integer>(aa));
}
如果是res.add(aa)那么,之后aa会再次改变与此同时之前在res中加入的那个元素也会随之改变!!!!!!
所以从此以后使用引用的时候,特别是在一个数组之类的之中加入对象的时候要使用带有参数的构造函数,比如
new ArrayList<Integer>(aa)
和new LinkedList<Integer>(aa)