首页 > 代码库 > 【leetcode刷题笔记】Permutations II
【leetcode刷题笔记】Permutations II
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]
, and [2,1,1]
.
题解:跟Permutation差不多,只是这次会有重复的元素,如下图所示,如果只用DFS的话就会产生重复的排列:
上图中括号内的数字代表这个1是序列中第几个1。上述DFS产生了两个112,121和211。我们可以把两个112写成:1(1) 1(2) 2和1(2) 1(1) 2,可以看到,产生重复的原因是我们其实并不区分当前的1是序列中的第几个1,所以如果我们可以保证序列中相同的元素只按照在序列中序号递增的顺序出现,就可以避免重复了。比如上述的112,我们只允许1(1) 1(2) 2这种情况,而步允许1(2) 1(1) 2这种情况出现。
只需要在判断的时候加上如下所示高亮部分的代码就可以做到这一点:
1 public class Solution { 2 public List<List<Integer>> permuteUnique(int[] num) { 3 List<List<Integer>> answerList = new ArrayList<List<Integer>>(); 4 ArrayList<Integer> currentList = new ArrayList<Integer>(); 5 boolean[] visited = new boolean[num.length]; 6 7 Arrays.sort(num); 8 DS(answerList, visited, num, currentList); 9 return answerList;10 }11 12 public void DS(List<List<Integer>> answerList,boolean[] visited,int[] num,ArrayList<Integer> currentList){13 boolean find = true;14 for(int i = 0;i < num.length;i++){15 if(i-1>=0 && num[i]== num[i-1] && visited[i-1] == false)16 continue;17 if(!visited[i]){18 currentList.add(num[i]);19 visited[i]= true;20 DS(answerList, visited, num, currentList);21 visited[i]= false;22 currentList.remove(currentList.size()-1);23 find = false;24 }25 }26 if(find){27 ArrayList <Integer> temp = new ArrayList<Integer>(currentList);28 answerList.add(temp);29 }30 }31 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。