zoukankan      html  css  js  c++  java
  • [LeetCode] 60. 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.

    求由n个数字组成的有序的排列中的第k个排列,因为只需返回第k个,所以不用将所有的排列组合都求出来,只求出第k个排列组合即可,重点在于找出排序和k的规律。

    参考:喜刷刷

    Python:

    class Solution(object):
        def getPermutation(self, n, k):
            """
            :type n: int
            :type k: int
            :rtype: str
            """
            seq, k, fact = "", k - 1, math.factorial(n - 1)
            perm = [i for i in xrange(1, n + 1)]
            for i in reversed(xrange(n)):
                curr = perm[k / fact]
                seq += str(curr)
                perm.remove(curr)
                if i > 0:
                    k %= fact
                    fact /= i
            return seq 

    C++:

    class Solution {
    public:
        string getPermutation(int n, int k) {
            string ret;
            vector<int> factorial(n,1);
            vector<char> num(n,1);
            
            for(int i=1; i<n; i++) 
                factorial[i] = factorial[i-1]*i;
            
            for(int i=0; i<n; i++)
                num[i] = (i+1)+'0';
            
            k--;
            for(int i=n; i>=1; i--) {
                int j = k/factorial[i-1];
                k %= factorial[i-1];
                ret.push_back(num[j]);
                num.erase(num.begin()+j);
            }
            
            return ret;
        }
    }; 

    C++:

    class Solution {
    public:
        string getPermutation(int n, int k) {
            string res;
            string num = "123456789";
            vector<int> f(n, 1);
            for (int i = 1; i < n; ++i) f[i] = f[i - 1] * i;
            --k;
            for (int i = n; i >= 1; --i) {
                int j = k / f[i - 1];
                k %= f[i - 1];
                res.push_back(num[j]);
                num.erase(j, 1);
            }
            return res;
        }
    };
    

      

    类似题目:

    [LeetCode] 46. Permutations 全排列

    [LeetCode] 47. Permutations II 全排列 II 

    [LeetCode] 31. Next Permutation 下一个排列

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    开发基于键值对形式的语言管理器LauguageManager
    基于Json(键值对)配置文件的配置管理器
    Unity换装效果
    技能冷却效果的制作
    c#中的反射
    委托和事件的区别
    字典
    有序列表
    链表

  • 原文地址:https://www.cnblogs.com/lightwindy/p/8553351.html
Copyright © 2011-2022 走看看