首页 > 其他 > 详细

60题-第k个排列

时间:2020-09-05 17:36:07      阅读:59      评论:0      收藏:0      [点我收藏+]

题目

技术分享图片

分析

其实很明显该排序强调的从小到大的排序就提示该题存在一定规律,比如如果k在[1,(n-1)!)之间时,那么我们就可以确定第一位数字为1,k在[(n-1)!,2*(n-1)!)之间时,那么第一位就是2.以此类推。
我们用一个数组来记录阶乘。然后开始对该字符串所有位置的的数值进行确定。

代码

class Solution {
    public String getPermutation(int n, int k) {
        int[] map = new int[n];
        for(int i  = 0 ; i < n ; ++i){
            if(i == 0) map[i] = 1;
            else map[i] = map[i-1]*i;
        }
        --k;
        StringBuilder res = new StringBuilder();
        int[] falg = new int[n+1];
        Arrays.fill(falg,1);
        for(int i = 1 ; i < n+1 ; ++i){
             int order = k / map[n - i] + 1;
             for(int j = 1 ; j < n+1 ; ++j){
                 order-=falg[j];
                 if(order == 0){
                     falg[j] =  0;
                     res.append(j);
                     break;
                 }
             }
              k %= map[n - i];
        }
        return res.toString();

    }
}

60题-第k个排列

原文:https://www.cnblogs.com/jiezao/p/13618417.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!