最简单的方法改个set就行了
class Solution {
Set<List<Integer>> ans;
int[] nums;
int len;
public List<List<Integer>> permuteUnique(int[] nums) {
this.nums = nums;
ans = new HashSet<>();
len = nums.length;
List<Integer> list = new ArrayList<>();
backtrack(list, 0, new boolean[len]);
return new ArrayList<>(ans);
}
void backtrack(List<Integer> list, int size, boolean[] visit) {
if(size == len) {
ans.add(new ArrayList<>(list));
return;
}
for (int i = 0; i < len; i++) {
if(!visit[i]) {
visit[i] = true;
list.add(nums[i]);
backtrack(list, size + 1, visit);
list.remove(size);
visit[i] = false;
}
}
}
}
最优做法如下:
先排序
然后如果这个元素和他前一位元素相同,并且前一位元素没有访问,那么直接continue;这样就能保证不会重复
class Solution {
List<List<Integer>> ans;
int[] nums;
int len;
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
this.nums = nums;
ans = new ArrayList<>();
len = nums.length;
List<Integer> list = new ArrayList<>();
backtrack(list, 0, new boolean[len]);
return ans;
}
void backtrack(List<Integer> list, int size, boolean[] visit) {
if(size == len) {
ans.add(new ArrayList<>(list));
return;
}
for (int i = 0; i < len; i++) {
if(i != 0 && nums[i] == nums[i-1] && !visit[i-1] || visit[i]) {
continue;
}
visit[i] = true;
list.add(nums[i]);
backtrack(list, size + 1, visit);
list.remove(size);
visit[i] = false;
}
}
}