• [LeetCode] Permutation Sequence


    The set [1,2,3,…,n] contains a total of n! unique permutations.

    By listing and labeling all of the permutations in order,
    We get the following sequence (ie, for n = 3):

    1. "123"
    2. "132"
    3. "213"
    4. "231"
    5. "312"
    6. "321"

    Given n and k, return the kth permutation sequence.

    Note: Given n will be between 1 and 9 inclusive.

    分析:首先想到的是回溯法的排列树+计数,但是排列树并不符合next_permutation 的关系,所以只能使用时间复杂度O(n^n)的排序树。。每个位置都有n中可能,记录下已经使用的数字,然后从未使用的数据中选择,然后递归调用,其实使用的还是回溯法的框架,有所更改。

    上Code,但是大数时会超时。。

     1 class Solution {
     2         vector<bool> m_avaliable;
     3         int m_k;
     4         int m_cnt;
     5         vector<int> m_array;
     6     public:
     7         string m_str;
     8 
     9         void dfs_permutation(int size, int dep)
    10         {
    11             if(dep == size)
    12             {
    13                 m_cnt ++;
    14                 if(m_cnt == m_k)
    15                 {
    16                     for(int i = 0; i < size; i++)
    17                     {
    18                         m_str += m_array[i] + '1';
    19                     }
    20                     return;
    21                 }
    22             }
    23 
    24             //dfs to the next level
    25             // every level has size choices, its time complexity is O(n^n)
    26             for(int i = 0; i < size; i++)
    27             {
    28                 if( m_avaliable[i] == true)
    29                 {
    30                     //cout <<"dep = " <<dep <<endl;
    31                     //cout <<"i   = " <<i <<endl;
    32                     m_array[dep] = i;
    33                     m_avaliable[i] = false;
    34                     dfs_permutation( size, dep+1);
    35                     m_avaliable[i] = true;
    36                 }
    37 
    38             }
    39 
    40 
    41 
    42         }
    43         string getPermutation(int n, int k)
    44         {
    45             //initinalize the member variable
    46             m_avaliable.resize(n, true);
    47             m_array.resize(n);
    48             m_k = k;
    49             m_cnt = 0;
    50             m_str.clear();
    51 
    52             //call dfs
    53             dfs_permutation(n, 0);
    54 
    55             // return 
    56             return m_str;
    57         }
    58 
    59 };

     方法二:基于 next permutation的方法的计算,复杂度O(n),不会超时,空间复杂度O(1)

     1 class Solution {
     2     public:
     3         string getPermutation(int n, int k)  
     4         {   
     5             k--;
     6 
     7             string s;
     8             vector<int> container;
     9             vector<int> res;
    10 
    11             for(int i = 1; i <=n; i++)
    12             {   
    13                 container.push_back(i);
    14             }   
    15             //printVector(container);
    16 
    17             for(int i = n-1; i >=0; i--)
    18             {   
    19                 int index = k/calcFactorial(i);
    20                 int value =  container[index];
    21                 res.push_back(value);
    22 
    23 
    24                 vector<int>::iterator findit = find(container.begin(),container.end(),value);
    25                 container.erase(findit);
    26                 k = k%calcFactorial(i);
    27 #if 0
    28                 cout << "===================================" <<endl;
    29                 cout << "i =	" << i <<endl;
    30                 cout << "index =	" << index <<endl;
    31                 printVector(container);
    32                 printVector(res);
    33                 cout << "===================================" <<endl;
    34 #endif
    35             }
    36             //printVector(res);
    37 
    38             for(int i = 0; i <res.size(); i++)
    39             {
    40                 s += res[i] + '0';
    41             }
    42             return s;
    43         }
    44 
    45         int calcFactorial(int n)
    46         {
    47             if(n == 0 || n == 1)
    48                 return 1;
    49             int sum = 1;
    50             for(int i = 2; i <= n; i++)
    51                 sum *= i;
    52             return sum;
    53         }
    54 
    55 };
  • 相关阅读:
    css 三种布局定位
    居中布局注意的要点
    CSS盒子3D模型
    SpringMVC中JSP取不到ModelAndView的数据原因
    如何让 height:100%; 起作用
    css形变
    消除html元素之间空白
    h5移动端网页头部标签模板
    大数据之Hadoop核心之HDFS
    大数据之Hadoop集群搭建
  • 原文地址:https://www.cnblogs.com/diegodu/p/3806603.html
Copyright © 2020-2023  润新知