• [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.

    最开始是暴力算,但是9!实在是太大了,显然超时,后来网上看到大牛们的算法,从前后向后找,已知对于每一次第n位的数字,都有(n-1)!个排列,所以可以根据这个规律直接找到答案。

     1 class Solution {  
     2 public:  
     3     string getPermutation(int n, int k) {
     4         string str;
     5         vector<int> factorial(n + 1, 1);
     6         for (int i = 1; i <= n; ++i) {
     7             str += i + '0';
     8             factorial[i] = factorial[i-1] * i;
     9         }
    10         string perm;
    11         --k;    // convert to 0-based index
    12         for (int i = n - 1; i >= 0; --i) {
    13             int quotient = k / factorial[i];
    14             perm += str[quotient];
    15             str.erase(quotient, 1);
    16             k %= factorial[i];
    17         }
    18         return perm;
    19     }
    20 }; 

    超时的算法:

     1 class Solution {
     2 public:
     3     string getPermutation(int n, int k) {
     4         string str;
     5         for (int i = 1; i <= n; ++i) {
     6             str.push_back('0' + i);
     7         } 
     8         if (n < 2) return str;
     9         
    10         int a, b;
    11         while (k--) {
    12             for (a = n - 2; a >= 0; --a) 
    13                 if (str[a] < str[a+1]) 
    14                     break;
    15             
    16             for (b = n - 1; b > a; --b) 
    17                 if (str[b] > str[a])
    18                     break;
    19             
    20             swap(str[a], str[b]);
    21             reverse(str.begin() + a + 1, str.end());
    22         }
    23         return str;
    24     }
    25 };
  • 相关阅读:
    Vue 基础篇一
    ES6常用语法
    Django的认证系统
    Django中的Form表单
    AJAX
    Django中的中间件
    Django ORM操作__聚合,分组查询
    Django ORM操作
    Luogu1382 楼房 (线段树 扫描线)
    Luogu2251 质量检测 (ST表)
  • 原文地址:https://www.cnblogs.com/easonliu/p/3680660.html
Copyright © 2020-2023  润新知