zoukankan      html  css  js  c++  java
  • 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):

    "123"

    "132"

    "213"

    "231"

    "312"

    "321"

            Given n and k, return the kth permutation sequence.

            Note: Given n will be between1 and 9 inclusive.

     

            思路:又是一个全排列的问题,首先想到的就是最普通的算法,从最初的123开始算起,算出下一个全排列,直到算出第k个全排列。按照这种算法实现的代码,在leetcode上的测试时间为152 ms。不是最好的实现方法。

            更好的思路是这样的,以n=4为例,它的全排列如下:

    1234,1243,1324,1342,1423,1432,

    2134,2143,2314,2341,2413,2431,

    3124,3142,3214,3241,3412,3421,

    4123,4132,4213,4231,4312,4321。

             可以将上述全排列分组,每一行就是一个分组,每个分组的大小为6,也就是n-1个数的全排列的总数。根据k可以得到最终结果在第几分组中。如果1<=k<=6,则最终结果的第一个数是1;如果7<=k<=12,则最终结果的第一个数是2;以此类推。这样就可以根据k、分组大小得到结果中的第一个数了。以k=7为例,也就是结果在第二个分组中。因此结果中的第一个数为2。

             得到第一个数之后,对k做一些调整,去掉前面的分组数:k = k-(2-1)*6,从而k=1。结果第一个数为2为,则剩下的就是1, 3, 4。这三个数的全排列如下:

    134,143,

    314,341,

    413,431.

             同样按照上面的思想,每个分组的大小为2。因k=1,所以,结果在第一个分组中,因此结果中第二个数为1。在对k作调整,k = k – (1-1)*2,k=1。剩下的数为3, 4。这两个数的全排列为:

    34,

    43.

             每个分组的大小为1,因k=1,所以,结果在第一个分组中,因此结果中第三个数为3。在对k作调整,k=k-(1-1)*1,k=1。剩下的数为4,这个数的全排列为:

    4.

             因k=1,所以,结果的第四个数为4,整个结果就是2134。这就是整个算法的基本思想。代码实现如下:

    char* getPermutation(intn, int k)
    {
        int i;
        int total = 1;
       
        int grouplen = 0;
        int groupth = 0;
       
        char *num = calloc(n+1,sizeof(char));
       
        for(i = 1; i <=n; i++)
        {
            num[i-1] = i+'0';
            total *= i;
        }
     
        if(k > total)
        {
            free(num);
            return NULL;
        }  
       
        char *res = calloc(n+1,sizeof(char));
        int index = 0;
     
        grouplen = total;
        while(n > 0)
        {
            grouplen = grouplen / n;
            groupth = (k-1)/grouplen;
            res[index++] = num[groupth];
            i = groupth;
            while(i < n-1)
            {
                num[i] = num[i+1];
                i++;
            }
            k -= groupth * grouplen;
            n -= 1;
        }
       
        free(num);
        return res;
    }

     

    参考:

    https://github.com/haoel/leetcode/blob/master/algorithms/permutationSequence/permutationSequence.cpp

  • 相关阅读:
    Best Time to Buy and Sell Stock
    Remove Nth Node From End of List
    Unique Paths
    Swap Nodes in Pairs
    Convert Sorted Array to Binary Search Tree
    Populating Next Right Pointers in Each Node
    Maximum Subarray
    Climbing Stairs
    Unique Binary Search Trees
    Remove Duplicates from Sorted Array
  • 原文地址:https://www.cnblogs.com/gqtcgq/p/7247130.html
Copyright © 2011-2022 走看看