LeetCode:第k个排列

第k个排列


题目叙述:

给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
给定 n 和 k,返回第 k 个排列。
说明:

  • 给定 n 的范围是 [1, 9]。
  • 给定 k 的范围是[1, n!]。
示例:

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

解题思路:

这一题的解题思路主要这样的,当我们n=1的时候会有1种情况,n=2会有2种情况,n=3会有6种情况,n=n会有(n!)种情况。当我们选择第k个序列的时候相当于我们的首位可以是第k/(n-1)!个数,依次第二位将是k%(n-1)!/(n-2)!个数······等等,因此我们将1~n用一个List集合存储起来,取出一个数后将其在List移出。直到List移空。时间复杂度为O(n)。

代码实现:
class Solution {
    public String getPermutation(int n, int k) {
        int[] nums = new int[n];
        List<Integer> help = new ArrayList();
        StringBuffer res=new StringBuffer();
        int num = 1;
        for (int i = 1; i < n+1; i++) {
            num *= i;
            nums[i - 1] = num;
            help.add(i);
        }
        k--;
        for (int i = n - 2; i > -1; i--) {
            res.append(help.get(k/nums[i]));
            help.remove(help.get(k/nums[i]));
            k%=nums[i];
        }
        res.append(help.get(0));
        return res.toString();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,421评论 0 2
  • LeetCode中与Permutations相关的共有四题:  31. Next Permutation  46....
    chenjieping1995阅读 9,419评论 1 13
  • 辞职一周,每天都围着找工作的主题转动,渐渐有些陷入去年找工作时期经历过的失落状态,却又隐隐有声音说 没事的,总会找...
    许一树梦话阅读 346评论 2 0
  • 适合阳光微热,岁月静好,吃饱喝足的时候,再来一杯绿茶,的时候,看这个电影。 是说高中时期的小姐妹团体。人到中年后一...
    风可林林阅读 197评论 0 0
  • 关键词: C语言中的位运算符、 左移和右移注意点、位运算防错准则、 位运算符和逻辑运算符的区别 1. C语言中的位...
    编程半岛阅读 431评论 0 1