美文网首页
LeetCode60-第k个排列

LeetCode60-第k个排列

作者: 白桃苏打 | 来源:发表于2018-09-13 17:54 被阅读0次

给出集合[1,2,3,…,n],其所有元素共有n! 种排列。

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

"123"

"132"

"213"

"231"

"312"

"321"

给定n 和k,返回第k个排列。

说明:

给定 n的范围是 [1, 9]。

给定 的范围是[1,n!]。

大致思路是根据k与总排列数(n!)的关系来推断出第k个排列,而不用依次求出排列直到第k个。

以每个数字开头的排列都有(n-1)!个,k/(n-1)!即可以求出字符串index为n-k-1处的字符。(注意字符串的index并非n-k,需要在开头加k--),以此类推更新k为除以(n-1)!所得的余数,更新n为n-1,再求下一位,直到n为1时终结。

如果使用递归则思路简单但很容易超时,基本也就是尾递归,用循环代替即可。

参考:https://blog.csdn.net/xiaoliucool1314/article/details/50777335

代码(java):

class Solution{

    public string getPermutation(int n, int k){

        k--;

        List<Integer> nums = new ArrayList<>();

        for(int i = 1;i <= n;i++)

            nums.add(i);

        int fac = 1;

        for(int i = 2;i < n;i++)

            fac *= i;

        int count = n - 1;

        StringBuilder res = new StringBuilder();

        while(count >= 0){

            res.append(nums.remove(k / fac));

            k %= fac;

            if(count > 0)

                fac /= count;

            count--;

        }

        return res.toString();

    }

}

        

相关文章

  • LeetCode60-第k个排列

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

  • 第k个排列

    https://leetcode-cn.com/explore/interview/card/bytedance/...

  • 输出数组的全排列

    思想: n 个元素数组全排列 = 第 1 个前缀 + 后 n - 1 个元素全排列 输出第 k 个元素之后的全排列...

  • 子集、全排列、第k个排列

    子集输出 全排列输出 存在重复数字的全排列 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大...

  • 排列类算法问题大总结

    全排列 带重复元素的排列 下一个排列 上一个排列 第 k 个排列 排列序号 排列序号II 全排列 给定一个数字列表...

  • LeetCode:第k个排列

    第k个排列 题目叙述: 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况...

  • 60.第k个排列

  • 60. 第k个排列

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

  • 011-第K个排列

    描述 一个序列[1, 2, 3, 4, ..., n]一共有n!个排列,写一个算法计算第k个排列; 分析 直观的方...

  • 60. 第k个排列

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

网友评论

      本文标题:LeetCode60-第k个排列

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