题目:给定一个可包含重复数字的序列 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);}}}}
