给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
对比46题增加了used数组,判断该数上次是否使用过。
TIME:O(N!)
SPACE:O(N)
1 class Solution { 2 public List<List<Integer>> permuteUnique(int[] nums) { 3 List<List<Integer>> res = new ArrayList<>(); 4 if(nums.length == 0 || nums==null)return res; 5 Arrays.sort(nums); 6 helper(res,new ArrayList<>(),nums,new boolean[nums.length]); 7 return res; 8 } 9 public void helper(List<List<Integer>> res,List<Integer> list,int[] nums,boolean[] used){ 10 if(list.size() == nums.length){ 11 res.add(new ArrayList<>(list)); 12 13 } 14 for(int i = 0;i < nums.length;i++){ 15 if(used[i] || i > 0 && nums[i] == nums[i - 1] && used[i-1])continue; 16 used[i] = true; 17 list.add(nums[i]); 18 helper(res,list,nums,used); 19 20 list.remove(list.size() - 1); 21 used[i]=false; 22 } 23 } 24 25 }