60. 排列序列

【题目】

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

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

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

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

示例 1:

输入: n = 3, k = 3
输出: "213"

示例 2:

输入: n = 4, k = 9
输出: "2314"

示例 3:

输入: n = 3, k = 1
输出: "123"

提示:

  • 1 <= n <= 9
  • 1 <= k <= n!

【题目解析】

解题方法

  1. 初始化:从1到n的数字列表,用于构建排列;一个记录阶乘的数组,用于快速计算不同长度下的排列数。

  2. 寻找第k个排列

    • 对于n个数,第一个数字的位置可以通过(k-1)/(n-1)!确定,其中(n-1)!表示除第一个数字外,剩下的数字组成的排列总数。
    • 确定第一个数字后,从列表中移除该数字,更新k值为k % (n-1)!,继续确定下一个数字。
    • 重复上述过程直到所有数字确定。
class Solution:
    def getPermutation(self, n: int, k: int) -> str:
        # 阶乘数组,用于计算不同位置的索引
        factorial = [1] * (n + 1)
        for i in range(1, n + 1):
            factorial[i] = factorial[i - 1] * I
        
        # 因为k是从1开始计数的,我们将k转换为从0开始
        k -= 1
        
        # 初始化数字列表和结果字符串
        nums = [str(i) for i in range(1, n + 1)]
        result = ''
        
        # 从最高位开始确定每个位置的数字
        for i in range(n, 0, -1):
            # 确定当前位置的数字
            index = k // factorial[i - 1]
            k %= factorial[i - 1]
            
            # 将确定的数字加到结果字符串,并从列表中移除
            result += nums.pop(index)
        
        return result

执行效率

image.png

【总结】

适用问题类型

  • 需要从排列组合中直接定位到特定位置的排列。
  • 排列数量庞大,无法直接枚举所有排列的场景。

解决算法:基于阶乘数系统的直接计算法

这种算法通过将排列问题转换为阶乘数系统的问题来解决,利用数学原理直接计算出第k个排列的具体形态。

算法特点

  • 高效率:直接根据给定的序号k计算出排列,避免了生成全部排列的巨大开销。
  • 低空间消耗:除了最终的排列字符串,算法运行过程中仅需存储阶乘数值和当前可选数字,空间复杂度低。
  • 易于实现:算法逻辑清晰,易于按照步骤实现。

时间复杂度与空间复杂度

  • 时间复杂度O(n^2),主要时间开销在于每次从列表中移除选定的数字,需要遍历列表。
  • 空间复杂度O(n),需要额外空间存储阶乘数值和当前可选数字列表。

实践意义

这种算法为解决大规模排列问题提供了有效的工具,尤其是在需要高效处理大量数据、直接找到解而不是枚举所有可能的情况时。在数据科学、密码学等领域,找到快速解决组合数学问题的方法具有重要的应用价值。此外,学习和实现这种算法可以帮助提升对组合数学和算法设计的理解,增强解决复杂问题的能力。

题目链接

排列序列

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,226评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,509评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,523评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,181评论 1 302
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,189评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,642评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,993评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,977评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,527评论 1 326
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,547评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,661评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,250评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,991评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,422评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,571评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,241评论 3 382
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,737评论 2 366

推荐阅读更多精彩内容