Loading

LeetCode 60 第k个排列

LeetCode60 第k个排列

题目描述

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

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

"123"
"132"
"213"
"231"
"312"
"321"

给定 nk,返回第 k 个排列。

样例

输入:n = 3, k = 3
输出:"213"
输入:n = 4, k = 9
输出:"2314"
输入:n = 3, k = 1
输出:"123"

算法分析

  • 枚举每个位置
  • 从高位到低位依次考虑每一位;
  • 对于每一位,从小到大依次枚举未使用过的数,确定当前位是几

时间复杂度

Java代码

class Solution {
    public String getPermutation(int n, int k) {
        boolean[] st = new boolean[10];
        int[] f = new int[10]; //存的阶乘
        f[0] = 1;
        for(int i = 1; i <= n; i++){
            f[i] = f[i - 1] * i;
        }

        String ans = "";
        for(int i = 0; i < n; i ++){
            for(int j = 1; i <= n; j++){
                if(!st[j]){
                    if(k <= f[n-i-1]){
                        ans = ans + "" + j;
                        st[j] = true;
                        break;
                    }
                    k -= f[n-i-1];
                }
            }
        }

        return ans;
    }
}
posted @ 2020-11-13 19:11  想用包子换论文  阅读(61)  评论(0)    收藏  举报