LeetCode 60.排列序列 题解
题目描述
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
“123”
“132”
“213”
“231”
“312”
“321”
给定 n 和 k,返回第 k 个排列。
样例
1 | 示例 1: |
1 | 示例 2: |
1 | 示例 3: |
1 | 提示: |
算法1
(枚举) $O(n^2)$
由于需要快速计算出从小到大第 k 位的排列值,那么我们可以考虑当确定了 i 位数字时,排列数目的变化;
首先,当任意一位数字都未确定时,总共排列的数目为 $n!$种
每确定一位数字, 剩余的排列数就会相应的变为 $(n - 1)!$种
那么,我们可以从小到大枚举尚未选择的最小数字,若当前第 k 个排列大于剩余的排列数 $(n - i)!$,那么说明第 k 个排列应该在以更大数字为起始的排列当中
C++ 代码
1 | class Solution { |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.