• [LeetCode 题解]: Permutation Sequcence


    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.

    --------------------------------------------------------------------------------------------------------------

    题解: 套用DFS模版居然超时了。。。。看来lzDFS还是不过关啊!

    lz怒了有木有,难道一定要DFS一个一个找吗?能不能直接找规律呢?

    经过推算,lz终于找到一个规律了,0(N)就能搞定啊!!!

    从全排列的产生可以看出,变化都是先从低位开始换位的。(此处高位指的是数组中下标减小的方向)

    如果想引起A[i]的变化,需要A[i+1]~A[n]完成一次全排列,即需要 (n-i-1)! 次 这个结果即为 fac(n-i-1).

    好吧,貌似好抽象! 给一个形象地例子,尝试着解释一下:

    1到9的阶乘如下
    fac[1~9] 分别为: 1  2  6  24  120  720  5040  40320  362880 ----------------------------------------------------------------------------- 输入 n=9  k=171996 src="123456789" 如果 k=1 直接返回 src, 当输入为k时,实际需要变化的次数为 k-1次。 因此 k=k-1 k=171995 ----------------------------------------------------------------------------- 判断第1位是否需要更换: k> fac[8] : 171995>40320.     更换的下标为: 171996/40320 = 4     因此des[0]=src[4]=‘5’   des="5"     取出src[4]         src="12346789"     k%=fac[8] :        k=10716 判断第2位是否需要更换: k> fac[7] : 10715>5040.     更换的下标为: 10716/5040 = 2     因此des[2]=src[2]=‘3’。 des="53"     取出src[2]        src="1246789"     k%=fac[7] :       k=635 判断第3位是否需要更换: k< fac[6] : 635<720.     src的首位不需要变化     因此des[3]=src[0]=‘1’。 des="531"     取出src[0]        src="246789"     k没有变化        k=635 判断第4位是否需要更换: k> fac[5] : 635>120.     更换的下标为: 635/120 = 5     因此des[4]=src[5]=‘9’。 des="5319"     取出src[5]        src="24678"     k%=fac[5]        k=35 判断第5位是否需要更换: k> fac[4] : 35>24.     更换的下标为: 35/24 = 1     因此des[5]=src[1]=‘4’。 des="53194"     取出src[1]        src="2678"     k%=fac[4]        k=11 判断第6位是否需要更换: k> fac[3] : 11>6.     更换的下标为: 12/6 = 1     因此des[6]=src[1]=‘6’。 des="531946"     取出src[1]        src="278"     k%=fac[3]       k= 5 判断第7位是否需要更换: k> fac[2] : 5>2.     更换的下标为: 5/2 = 2     因此des[7]=src[2]=‘8’。 des="5319468"     取出src[1]        src="27"     k%=fac[2]       k= 1 判断第8位是否需要更换: k>= fac[1] : 1>=1.     更换的下标为: 1/1 = 1     因此des[7]=src[2]=‘7’。 des="53194687"     取出src[1]        src="2"     k%=fac[2]       k= 0 最后仅剩余src仅有1位,直接添加到des最后 des=”531946872

    ok,上代码!

     1 class Solution {
     2 public:
     3     vector<int> fac;
     4     string getPermutation(int n, int k) {
     5        string src,des;
     6        
     7        fac.resize(10,1);
     8        for(int i=2;i<=n;i++) fac[i] = fac[i-1]*i;
     9 
    10        if(k>fac[n]) return des;
    11        for(int m=1;m<=n;m++) src+=('0'+m);  //源字符串初始化
    12        
    13        k--;
    14        for(int j=n;j>1;j--)
    15        {
    16            if(k>=fac[j-1])
    17            {
    18               int temp = k/fac[j-1];
    19               k%=fac[j-1];
    20               des+=src[temp];
    21               src.erase(temp,1);
    22            }
    23            else
    24            {
    25               des+=src[0];
    26               src.erase(0,1);
    27            }
    28        }
    29        des+=src[0];
    30        return des;
    31     }
    32 };

     转载请注明出处: http://www.cnblogs.com/double-win/ 谢谢!

  • 相关阅读:
    elasticsearch配置文件详解
    《禅的故事》--易中天
    《爱你就像爱生命》--王小波
    Adaboost算法及其代码实现
    HOG特征原理及代码实现
    SMO算法--SVM(3)
    非线性支持向量机SVM
    核方法-核技巧-核函数
    线性可分支持向量机与软间隔最大化--SVM(2)
    拉格朗日乘子(Lagrange multify)和KKT条件
  • 原文地址:https://www.cnblogs.com/double-win/p/3794887.html
Copyright © 2020-2023  润新知