前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >60. 第k个排列

60. 第k个排列

作者头像
张伦聪zhangluncong
发布2022-10-26 18:13:51
1470
发布2022-10-26 18:13:51
举报
文章被收录于专栏:张伦聪的技术博客

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

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

代码语言:javascript
复制
"123"
"132"
"213"
"231"
"312"
"321"

给定 n 和 k,返回第 k 个排列。

说明:

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

示例 1:

代码语言:javascript
复制
输入: n = 3, k = 3
输出: "213"

示例 2:

代码语言:javascript
复制
输入: n = 4, k = 9
输出: "2314"

解:

代码语言:javascript
复制
class Solution {
    public static String getPermutation(int n, int k) {
        LinkedList<Integer> list = new LinkedList<Integer>();
        for (int i = 1; i <= n; i++) {
            list.add(i);
        }
        return getNextRange(list, k - 1);
    }

    public static String getNextRange(LinkedList<Integer> list, int k) {

        String result = "";
        if (list == null || list.size() == 0) {
            return result;
        }
        //求总的排列数
        int total = 1;
        for (int i = 1; i <= list.size(); i++) {
            total = total * i;
        }
        //每个数字开头有几种排列
        int every = total / list.size();
        //几开头,在list中的索引
        int range = k / every;
        //几开头,的第几个排列
        int other = k % every;

        Integer temp = list.get(range);
        list.remove(list.get(range));
        
        //递归
        result = temp + getNextRange(list, other);
        return result;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档