首页 > 代码库 > Permutations II <LeetCode>

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         else42         {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 };

 

Permutations II <LeetCode>