要求:给出一个具有重复数字的列表,找出列表所有不同的排列。
样例:
给出列表 [1,2,2]
,不同的排列有:
[ [1,2,2], [2,1,2], [2,2,1] ]
思路:和前面的1没有重复数字的全排列差不多,http:///aphysia/article/details/77774105,其中为了去除重复的元素,先对它们进行排序,然后相同的数会在一起,我们插入的时候要求排在前面的在结果中也排在前面,这样就保证了唯一性。
class Solution { /** * @param nums: A list of integers. * @return: A list of unique permutations. */ public List<List> permuteUnique(int[] nums) { // Write your code here ArrayList<List>res=new ArrayList<>(); if(nums == null){ return null; } if(nums.length == 0) { res.add(new ArrayList()); return res; } ArrayListList=new ArrayList<>(); ArrayList.sort(nums); int n=nums.length; int []visited=new int[n]; for(i=0;i<n;i++){ visited[i]=0; } helpsort(res,list,visited,nums); return res; } private void helper(ArrayList<List> res, ArrayListlist, int[] visited, int[] nums) { if(nums.length == list.size()) { res.add( new ArrayList(list)); return; } for(int i=0;i<nums.length;i++) { if(visited[i] == 1 || (i!= 0 && (visited[i-1] == 0 && nums[i] == nums[i-1])))//已经被访问过的和没有被访问过但是前面有一个相同的数没有被访问过,都不能加进去 continue; list.add(nums[i]); visited[i] = 1; helper(res, list, visited, nums); list.remove(list.size()-1); visited[i] = 0; } } }