原题链接:60. 排列序列
难度分类:Hard
# Problem
给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时,所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
给定 n 和 k,返回第 k 个排列。
Examples
-
示例 1:
输入:n = 3, k = 3
输出:"213" -
示例 2:
输入:n = 4, k = 9
输出:"2314" -
示例 3:
输入:n = 3, k = 1
输出:"123"
# Approach
例如: n = 6, k = 373
初始化数组 remain = [1, 2, 3, 4, 5, 6]
;
首先应该明白,以 1 开头的全排列有 5!
个,以 2 开头的全排列有 5!
个 …… 共 5! ∗ 6 = 6!
个;
- 故 k = 373 时,全排列的第一个数字应该是
remain[k / 5!] = 4
; - 数组删除
4
, 此时remain = [1, 2, 3, 5, 6]
;k = k % 5! = 12
; - 接下来就是在
remain
中找第 12 个全排列,重复 1,2 步即可 。
# Code
class Solution { | |
public String getPermutation(int n, int k) { | |
List<Integer> remain = new ArrayList<>(); | |
List<Integer> ans = new ArrayList<>(); | |
k--; | |
int x = 1; | |
for(int i = 1; i <= n; i++) { | |
x *= i; | |
remain.add(i); | |
} | |
while(remain.size() > 0) { | |
x /= (n--); | |
int index = k / x; | |
ans.add(remain.get(index)); | |
remain.remove(index); | |
k %= x; | |
} | |
String ret = ""; | |
for(int i : ans) { | |
ret += String.valueOf(i); | |
} | |
return ret; | |
} | |
} |