华为OD-E卷:第k个排列问题详解
问题描述
给定参数n,从1到n会有n个整数:1,2,3,…,n,这n个数字共有n!种排列。按字典序(升序)列出所有排列,并标记序号。给定n和k,返回第k个排列。
输入格式
- 第一行:整数n(1 ≤ n ≤ 9)
- 第二行:整数k(1 ≤ k ≤ n!)
输出格式
- 第k个排列的字符串形式
约束条件
- n的范围:[1, 9]
- k的范围:[1, n!]
- 排列按字典序升序排列,从第1个开始计数
算法分析
问题本质
这是一个排列组合问题,核心是理解字典序排列的规律。我们需要找到第k个排列,而不是生成所有排列。
解法对比
| 方法 | 时间复杂度 | 空间复杂度 | 是否可行 |
|---|---|---|---|
| 暴力生成所有排列 | O(n! × n) | O(n!) | n≤9时可行 |
| 数学计算法 | O(n²) | O(n) | 最优解 |
| 回溯法 | O(n!) | O(n) | 效率较低 |
数学计算法(最优解)
核心思想: 利用排列的数学性质,通过计算确定每一位的数字,而不需要生成所有排列。
关键观察:
- 以某个数字开头的排列有(n-1)!个
- 可以通过k值计算应该选择哪个数字作为当前位
- 递归地处理剩余位置

2692

被折叠的 条评论
为什么被折叠?



