每日一题算法:2020年9月5日[ 第k个排列] getPermutation

本文介绍了如何解决算法问题——找到第k个排列。通过递归思路,解析了如何确定每个位置上的数字,从而找到指定的排列。以n=5, k=54为例,详细解释了如何逐步得出第54个排列31542,并通过代码进行了验证。" 120242222,9904251,R语言快速读取大TXT文件:fread与data.table,"['R语言', '数据读取', '生信分析', 'data.table']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2020年9月5日 第k个排列getPermutation

在这里插入图片描述

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

    }
}

解题思路:

思路1,暴力算法

直接使用循环将每一种情况按照顺序列出,然后取出第k个元素,时间复杂度nXn!,这肯定不是一个好的方法,所以需要寻找一种更优秀的方法。

思路2,递归

其实我们可以非常简单地知道,第k个数的第1个数字是多少,比如:

n=5 k=54,由于n=5,我们可以知道共有5!种排列,那么以1开头的元素必定有4!个,那么我们可以知道以1开头的数字必定是比以2开头的数字小的,那么前面4!=24个都是以1开头,再后面的24个是以2开头,这里已经有48个了,所以第54个必定是以3开头的。

那么我们如何递归解决这道问题呢?

递归的思路,把大的问题化解成小的问题。

我们在上面已经会求出n=5 ,k =54时第k个排列的开头数字是3了。那么,第二个数字怎么得到呢?我们可以通过剩下的数字,4个,此时我们可以知道第49个到72个都是以数字3开头的,那么在这24个排列中,我们依然可以套用上面的方式,只是需要除掉数字3。

在这24个排列中,以1开头的依然面几个,只不过数量从4!下降到了3!,也就是6个,54是在第6个,所以刚好也是以1开头的。

依次类推,剩下的2,4,5组成的排列组合的第6个那么得到的就是5是第3个。

以2,4组成的排列组合的第二个,也就是4是四个数字。

最后一个是2。

得到的排列时31542。

我们用官方的方法验证一下。
在这里插入图片描述

代码实现:
在这里插入图片描述

    String res="";
    List<Integer> ints=new ArrayList<>();
    public String getPermutation(int n, int k) {

        //构建链表
        for (int i=1;i<=n;i++){
            ints.add(i );
        }
        recursion(k-1);
        return res;
    }
    //递归方法,一个k表示取出排列的第k个组合
    public void recursion(int k){

        //我们自己获取n
        int n=ints.size();
        //递归结束条件
        if (n==0)
            return;
        //得到阶乘
        int nj=1;
        for (int i=1;i<n;i++){
            nj*=i;
        }
        //得到此时的数字是什么
        int k1=k/nj;

        //拼接上
        res=res+ints.get(k1);

        ints.remove(k1);

        int k2=k%nj;

        recursion(k2);

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值