Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,[1,1,2]
have the following unique permutations:
[ [1,1,2], [1,2,1], [2,1,1] ]
本题开始并没有什么办法来解决重复数字的问题,后来想到了以前做过的contains duplicate的方法,可以先把数组排序,然后比较前一个数字和当前数字是否相等来判断是否有重复数字,但是
仍然解决不了本题,因为我们之前在permutation1里面用的排除法是list.contains()函数做的,如果用在这个题目上面,那么就不能把重复数字加入list里面了,我们就要另外设置一个used
数组来专门存放是否使用过该数字,数组的想法很巧妙,contains是对整体是否包含的排除,而used数组是对每一个number进行排除。判断当前used为false时候,看他前面的数字是否和他一样,
如果一样,并且used为false,则表示以前使用过这个,就不能再插入这个了,如果为true,则表示可以继续插入,因为是第一次插入。代码如下:
1 public class Solution { 2 public List<List<Integer>> permuteUnique(int[] nums) { 3 List<List<Integer>> res = new ArrayList<>(); 4 Arrays.sort(nums); 5 backtracking(nums,res,new ArrayList<Integer>(),new boolean[nums.length]); 6 return res; 7 } 8 public void backtracking(int[] nums,List<List<Integer>> res,List<Integer> list,boolean[] used){ 9 if(list.size()==nums.length) res.add(new ArrayList<Integer>(list)); 10 else{ 11 for(int i=0;i<nums.length;i++){ 12 if(used[i]||i>0&&nums[i-1]==nums[i]&&used[i-1]) continue; 13 used[i] = true; 14 list.add(nums[i]); 15 backtracking(nums,res,list,used); 16 used[i] = false; 17 list.remove(list.size()-1); 18 } 19 } 20 } 21 }