zoukankan      html  css  js  c++  java
  • Permutations II <LeetCode>

    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].

         思路首先按照正常的DFS算法进行计算(先进行快排),当出现一个字符等于前一个数字时,有两种方法可以解决重复 1:当出现该数字等于前一个数字时,如果前一个数字已经被使用,则该数字才可以使用,相当于对相同的数字进行一定的排序,在结果中不管这些元素在哪只能按着该次序出现,因此就避免了重复。  2:第二种方法和第一种方法相反,当出现一个数字和上一个数字相等时,如果前一个数字没有被使用,则该数字才可以使用,这样如果第一个被使用的不是相同数字中的最后一个,就不会产生一个全排列,因为这个数被使用了,它后面一个相同的数字就永远不会被使用,也相当于对相同的数字进行了排序,只不过和方法1是相反的,因此也能避免重复

     1 struct  tt
     2 {
     3     int val;
     4     bool aa;
     5     
     6 };
     7 
     8 class Solution {
     9 public:
    10     vector<vector<int>> result;
    11     vector<tt> temp;
    12     vector<vector<int> > permuteUnique(vector<int> &num) {
    13         vector<tt>  nu;
    14         sort(num.begin(),num.end());
    15         for(int i=0;i<num.size();i++)
    16         {
    17             tt t;
    18             t.val=num[i];
    19             t.aa=false;
    20             nu.push_back(t);
    21         }
    22         temp.clear();
    23         result.clear();
    24         getback(nu,0);
    25         return result;
    26     }
    27     
    28     void getback(vector<tt> &num,int dep)
    29     {
    30         if(dep==num.size())
    31         {
    32             vector<int>  t;
    33             for(int i=0;i<dep;i++)
    34             {
    35                 t.push_back(temp[i].val);
    36             }
    37             result.push_back(t);
    38 
    39             return;
    40         }
    41         else
    42         {
    43             for(int i=0;i<num.size();i++)
    44             {
    45                 if(i>0&&num[i].val==num[i-1].val&&num[i].aa==false&&num[i-1].aa==false)   //*出现相同数字时从前面的书记开始使用,  改为num[i-1].aaa==true表示从后边开始使用也可以*/
    46                 {
    47                     continue;
    48                 }
    49                 else if(num[i].aa==false)
    50                 {
    51                   num[i].aa=true;
    52                   temp.push_back(num[i]);
    53                   getback(num,dep+1);
    54                   temp.pop_back();
    55                   num[i].aa=false;
    56                 }
    57             }
    58         }
    59     }
    60 };
  • 相关阅读:
    JavaScript学习-4——DOM对象、事件
    JavaScript学习-3——数组、函数、递归
    CSS样式学习-3、轮廓、伪类/元素、display-flex布局
    目前为止学习过的循环解析过程
    早期自学jQuery-二事件
    Hive问题 记录
    `how to install hive
    mongodb读取测试
    reading list
    HIVE相关命令记录
  • 原文地址:https://www.cnblogs.com/sqxw/p/3938509.html
Copyright © 2011-2022 走看看