题解 | #没有重复项数字的全排列#
没有重复项数字的全排列
https://www.nowcoder.com/practice/4bcf3081067a4d028f95acee3ddcd2b1
代码:
public class Solution {
//我的思路,取出来一个元素,然后剩下的元素去排,排的时候加上取出来那个。
public ArrayList<ArrayList<Integer>> permute(int[] num) {
// if (num.length == 1) {
// ArrayList<Integer> list1 = new ArrayList<>(1);
// list1.add(num[0]);
// ArrayList<ArrayList<Integer>> list2 = new ArrayList<>(1);
// list2.add(list1);
// return list2;
// }
int length = num.length;
//先把num排序
Arrays.sort(num);
//转数组
List<Integer> sourceList = new ArrayList<>();
Arrays.stream(num).forEach(v -> sourceList.add(v));
List<Integer> list = new ArrayList<>(); //依次保存取出来的元素
ArrayList<ArrayList<Integer>> resultList = new ArrayList<>();
// for (Integer i : sourceList) {
// list.add(i);
// m1(sourceList, i, list, resultList, length);
// }
m1(sourceList, null, list, resultList, length);
return resultList;
}
void m1 (List<Integer> sourceList, Integer toRemove, List<Integer> list,
ArrayList<ArrayList<Integer>> resultList, int length) {
List<Integer> sourceList2 = new ArrayList<>(sourceList); //深拷贝
sourceList2.remove(toRemove);
for (Integer i : sourceList2) {
ArrayList<Integer> list2 = new ArrayList<>(list); //深拷贝
list2.add(i);
if (list2.size() == length) {
resultList.add(list2);
} else {
m1(sourceList2, i, list2, resultList, length);
}
}
}
}
我的做题步骤:
考虑到使用迭代。
我的思路:取出来一个元素,然后剩下的元素去排,排的时候加上取出来那个。然后再取第二个元素,剩下元素去排。
遇到的问题:
1)代码提交后第一个问题出现在深拷贝

这行代码写到了for循环之上,这样会导致第一个元素,一直被放到list中。
2)迭代的初始,不好写初始迭代,用了for循环。

这样也是会导致第一个元素,一直被放到list中。改进,去掉for循环,直接调递归,第一次传入一个null。此时,数组长度等于1的情况也合并到了递归里。
总结:
1)本题,肉眼自测测得不对。
2)迭代的初始步骤,不太会写。我目前的写法是先大概写出来,然后调用递归。后期再看能不能合并到递归里,包括特殊情况也合并到递归里。
查看14道真题和解析