题目:给定一个可包含重复数字的序列 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]]
提示:
- 对当前数组排序,方便后面去重
- 设置一个布尔类型的数组isVisted,判断当前数字是否被使用过
- 设置depth深度,深度达到nums.length时,递归结束
回溯:在循环内,i从0到nums.length,
- 每次开始时判断当前字符是否被用过,如果被使用过则直接到下一次循环;判断前一个字符是否跟当前字符一样,如果一样则跳过
每次递归depth+1,且当前字符加入到list,每次结束时list删除最后一个字符
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if(nums.length == 0)
return res;
int n = nums.length;
Arrays.sort(nums);
boolean []isVisted = new boolean[n];
List<Integer> list = new ArrayList<>();
dfs(0,nums,res,list,isVisted);
return res;
}
public void dfs(int depth,int[] nums,List<List<Integer>> res,List<Integer> list,boolean []isVisted ){
if(depth == nums.length){
res.add(new ArrayList<>(list));
}
for(int i = 0 ; i < nums.length;i++){
if(!isVisted[i]){
if(i > 0 && isVisted[i-1] == true && nums[i] == nums[i - 1]){
continue;
}
list.add(nums[i]);
isVisted[i] = true;
dfs(depth + 1,nums,res,list,isVisted);
isVisted[i] = false;
list.remove(list.size() - 1);
}
}
}
}