给定一个可包含重复数字的序列,返回所有不重复的全排列。
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> newSet = new ArrayList<>();
Arrays.sort(nums);//剪枝的前提是排序
count(newSet, nums, new ArrayList<Integer>(), new int[nums.length]);
return newSet;
}
private void count(List<List<Integer>> res, int[] nums, List<Integer> tmp, int[] visited) {
if (tmp.size() == nums.length) {
res.add(new ArrayList<>(tmp));
return;
}
for (int i = 0; i < nums.length; i++) {
if (visited[i] == 1) {//说明这个数字使用过了
continue;
}
if (i>0 && nums[i]==nums[i-1] && visited[i-1]==1){//如果这个数字和上个选择的数字相同,会出现重复
continue;
}
visited[i] = 1;
tmp.add(nums[i]);
count(res, nums, tmp, visited);
visited[i] = 0;//回溯
tmp.remove(tmp.size() - 1);//删除最后一个数字
}
}
}