zoukankan      html  css  js  c++  java
  • LeetCode

    Permutations II

    2013.12.15 05:30

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

    Solution:

      This time the array may contain duplicates, so I implemented the next_permutation() myself, and called it until all the permutations are traversed.

      You can see the two problems here and find their connection with this problem: Next Permutation and Permutations.

      Time complexity is O(n * n! / (a! * b! * c! * ...)), where a, b, c, ... are the number of groups of duplictate elements. Space complexity is O(n).

    Accepted code:

     1 // 1CE, 2MLE, 1AC, not so easy
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 class Solution {
     6 public:
     7     vector<vector<int> > permuteUnique(vector<int> &num) {
     8         // IMPORTANT: Please reset any member data you declared, as
     9         // the same Solution instance will be reused for each test case.
    10         int i, j;
    11         int n;
    12         
    13         n = result.size();
    14         for(i = 0; i < n; ++i){
    15             result[i].clear();
    16         }
    17         result.clear();
    18         
    19         sort(num.begin(), num.end());
    20         n = num.size();
    21         if(n <= 0){
    22             return result;
    23         }
    24         while(true){
    25             result.push_back(num);
    26             for(i = n - 1; i > 0; --i){
    27                 if(num[i - 1] < num[i]){
    28                     break;
    29                 }
    30             }
    31             if(i <= 0){
    32                 break;
    33             }
    34             --i;
    35             for(j = n - 1; j > i; --j){
    36                 if(num[j] > num[i]){
    37                     break;
    38                 }
    39             }
    40             myswap(num[j], num[i]);
    41             // 2MLE here, reverse(i + 1, n - 1), not reverse(i, n - 1);
    42             reverse(num, i + 1, n - 1);
    43         }
    44         
    45         return result;
    46     }
    47 private:
    48     vector<vector<int>> result;
    49     void myswap(int &x, int &y) {
    50         int tmp;
    51         
    52         tmp = x;
    53         x = y;
    54         y = tmp;
    55     }
    56     
    57     void reverse(vector<int> &num, int left, int right) {
    58         int i;
    59         
    60         if(left > right){
    61             reverse(num, right, left);
    62             return;
    63         }
    64         
    65         i = left;
    66         // 1CE here, how did you submit before even finishing it!!!
    67         while(i < left + right - i){
    68             myswap(num[i], num[left + right - i]);
    69             ++i;
    70         }
    71     }
    72 };
  • 相关阅读:
    完美世界经典版本881外挂
    ShowModal 动态创建窗体和释放窗体
    HTML 颜色代码大全
    padding margin border 的四值顺序
    三 C# Socket通信 窗体控件与多线程
    Java解压缩Zip 文件
    八 C# Socket通信 通信协议设计
    CSS+DIV实现鼠标经过背景变色
    七 C# Socket通信 阻塞性线程的快速终止
    二 C# Socket通信模式
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3474959.html
Copyright © 2011-2022 走看看