LeetCode 60 第k个排列

1.问题重述

给出集合 [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”

2.问题分析

本来想着拿回溯做的,但是学习太死板了,就开始用其他的偏路子,最后找出的偏路子,每个数的全排列都是3!个,也就是说1 + 对2,3,4的全排列 (3!个) ,2,3,4同理,先用List容器进行数的存放,之后确定第一位,即 index = k / (n-1)! = 2, 说明第15个数的第一位是3 ,2,3,4同理

3.代码

class Solution { 
    
    public String getPermutation(int n, int k) {

        
        StringBuilder sb = new StringBuilder();
        // 候选数字
        List<Integer> candidates = new ArrayList<>();
        // 分母的阶乘数
        int[] factorials = new int[n+1];
        factorials[0] = 1;
        int fact = 1;
        for(int i = 1; i <= n; ++i) {
            candidates.add(i);
            fact *= i;
            factorials[i] = fact;
        }
        k -= 1;
        for(int i = n-1; i >= 0; --i) {
            // 计算候选数字的index
            int index = k / factorials[i];
            sb.append(candidates.remove(index));
            k -= index*factorials[i];
        }
        return sb.toString();
    }
}

4.结果

学习别人的想法,不用多说
LeetCode 60 第k个排列_第1张图片

你可能感兴趣的:(刷题)