zoukankan      html  css  js  c++  java
  • 【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 }
  • 相关阅读:
    node.js---sails项目开发(3)
    node.js---sails项目开发(2)
    基于 phantomjs 的自动化测试---(1)
    node.js---sails项目开发(1)
    mongoose基于mongodb的数据评论设计
    js复杂数据格式提交
    [LeetCode]Rotate Image
    [LeetCode]Minimum Path Sum
    [LeetCode]Generate Parentheses
    [LeetCode]Gray Code
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/3860981.html
Copyright © 2011-2022 走看看