美文网首页
LeetCode #60 排列序列

LeetCode #60 排列序列

作者: 刘煌旭 | 来源:发表于2021-04-02 23:51 被阅读0次
给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

"123"
"132"
"213"
"231"
"312"
"321"
给定 n 和 k,返回第 k 个排列。

 

示例 1:

输入:n = 3, k = 3
输出:"213"
示例 2:

输入:n = 4, k = 9
输出:"2314"
示例 3:

输入:n = 3, k = 1
输出:"123"
 

提示:

1 <= n <= 9
1 <= k <= n!
/**
* It's quite difficult to explain how this piece of code works...
*/
int kthdigit(int *digits, bool *flags, int n, int k) {
    for (int i = 1; i <= n; i++) {
        if (!flags[i]) k -= 1;
        if (k == 0) return digits[i];
    }
    return 0;
}
char * getPermutation(int n, int k){
    char *s = (char*)malloc((n + 1) * sizeof(*s));
    s[n] = '\0';
    
    int np[n + 1], lo = 1;
    np[0] = 1;
    do {
        np[lo] = np[lo - 1] * lo;
    } while (np[lo++] < k);
    lo -= 1;
    if (np[lo] == k) {
        for (int i = 0; i < n - lo; i++) { s[i] = (char)(i + 1) + '0'; }
        for (int i = n - lo; i < n; i++) { s[i] = (char)(n - (i - (n - lo))) + '0'; }
    } else {
        int digits[n + 1];
        bool flags[n + 1];
        for (int i = 1; i <= n; i++) {
            digits[i] = i;
            flags[i] = false;
        }

        lo -= 1;
        for (int i = 0; i < n - lo - 1; i++) {
            s[i] = (char)(i + 1) + '0';
            flags[i + 1] = true;
        }

        

        for (int i = n - lo - 1; i < n; i++) {
            int kth = n - i;
            if (k > 0) {
                kth = (int)ceil((double)k / (double)np[lo]);
                k %= np[lo--];
            }
            
            int digit = kthdigit(digits, flags, n, kth);
            s[i] = (char)digit + '0';
            flags[digit] = true;
        }
    }
    

    return s;
}

相关文章

  • LeetCode #60 排列序列

  • LeetCode - #60 排列序列

    前言 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。微博:@故胤...

  • python实现leetcode之60. 排列序列

    解题思路 factorial[i]保存有1到i的排列的总数,最后一项factorial[-i]就是1到n全排列的总...

  • 【leetcode】全排列

    【leetcode】全排列 题目: 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1...

  • LeetCode-46-全排列

    LeetCode-46-全排列 题目 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,...

  • Day27 全排列

    给定一个 没有重复 数字的序列,返回其所有可能的全排列 https://leetcode-cn.com/probl...

  • LeetCode-31-下一个排列

    LeetCode-31-下一个排列 题目 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个...

  • [LeetCode]60、第K个排列

    题目描述 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记...

  • Leetcode 46. 全排列

    题目 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: C++解法 来源:力扣(LeetCode)链接...

  • 【LeetCode通关全记录】441. 排列硬币

    【LeetCode通关全记录】441. 排列硬币 题目地址:441. 排列硬币[https://leetcode-...

网友评论

      本文标题:LeetCode #60 排列序列

      本文链接:https://www.haomeiwen.com/subject/lgsckltx.html