考察: 深度优先遍历 深拷贝
class Solution {
// 深度优先遍历, 深拷贝
// 就是被深拷贝折磨了, 差点以为自己的思路错了
public List<List<Integer>> permute(int[] nums) {
// 用来保存结果
List<List<Integer>> ls = new ArrayList<List<Integer>>();
// 用来保存数组的集合
List<Integer> numsLs = new ArrayList<Integer>();
// 增强for循环来遍历数组加入到集合中
for(int i : nums) {
numsLs.add(i);
}
// 开始递归
recursion(new ArrayList<Integer>(), numsLs, ls, -1);
return ls;
}
private void recursion(ArrayList<Integer> arrayList, List<Integer> numsLs, List<List<Integer>> ls, int num) {
// 若不为开始, 则添加值进入到arrayList, 然后把值从原集合中移除
if(num != -1) {
arrayList.add(numsLs.get(num));
numsLs.remove(num);
}
// 若集合为空, 说明已经递归完成
if(numsLs.isEmpty()) {
// 此处使用new来添加进入到ls中, 或许不用?
ls.add(new ArrayList<Integer>(arrayList));
return;
}
System.out.println(numsLs.size());
for(int i = 0; i < numsLs.size(); i++) {
// 递归, 此处必须new来传递数值, 不然会传地址值, 传地址的话, 每个节点的操作就会互相影响, 得出的结果就会一团乱
recursion(new ArrayList<Integer>(arrayList), new ArrayList<Integer>(numsLs), ls, i);
}
}
}