【DFS】这道题和上一个区别就在于需要去重,首先就是一个带visit标记的dfs,这个很简单。去重的话需要先对可用元素nums排序,如果发现i > 0 && nums[i] = nums[i - 1] && !st[i - 1]就跳过,这里为什么是非st呢,因为用过前面的nums[i - 1]后返回上一层后会把i - 1的标记置为0,再进入下一层的时候虽然标记为0表示没有用过,但是因为他和现在要用的重复了,所以就得直接跳过了。
class Solution {
public List<List<Integer>> ans = new ArrayList();
int[] nums, arr;
int n;
boolean[] st;
void dfs(int t) {
if (t == n) {
List<Integer> list = new ArrayList() {{ for (int x: arr) add(x); }};
ans.add(list);
return;
}
for (int i = 0; i < n; i++) {
if (i > 0 && nums[i] == nums[i - 1] && !st[i - 1]) continue;
if (!st[i]) {
arr[t] = nums[i];
st[i] = true;
dfs(t + 1);
st[i] = false;
}
}
}
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
this.nums = nums;
n = nums.length;
arr = new int[n];
st = new boolean[n];
dfs(0);
return ans;
}
}