给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
其实这道题一看就是递归加回溯。主要难点是不重复的全排列。首先当然是先对数组做排序,然后在递归时记录上一个被删掉的值。如果下一个要加入的值等于上一个被删掉的值。那么要加入的值一定会和之前重复。否则的话,不会重复,加进去继续递归。
class Solution {
List<List<Integer>> ret = new ArrayList<>();
List<Integer> seq = new ArrayList<>();
int[] nums;
int len;
boolean[] isUse;
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
this.nums = nums;
len = nums.length;
isUse = new boolean[len];
dfs();
return ret;
}
public void dfs() {
if (seq.size() == len) {
ret.add(new ArrayList<>(seq));
return;
}
int lastVal = Integer.MAX_VALUE;
for (int i = 0; i < len; ++i) {
if (nums[i] != lastVal) {
if (!isUse[i]) {
seq.add(nums[i]);
isUse[i] = true;
dfs();
lastVal = seq.get(seq.size() - 1);
seq.remove(seq.size() - 1);
isUse[i] = false;
}
}
}
}
}