60. 排列序列
排列序列
题目描述:
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
“123”
“132”
“213”
“231”
“312”
“321”
给定 n 和 k,返回第 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!
思路:
难得双百分比,思路是参考题解大神的,是一道类似于数学题,就例子中 3 3举例,第一个数字是怎么判断的呢,是 3 除以 2(1*2)等于1,知道第一个数为2,就是k /(n-1)的阶乘就知道第一个数是哪个数,以此类推求出之后的数,记得求出一个数就把这个数从数组中取出
代码:
func getPermutation(n int, k int) string {
num ,total := make([]byte,0,n),1
for i:=1;i<=n;i++{
num = append(num,byte(i)+'0')
total *= i
}
res := make([]byte,0,n)
for i:=n;i>0;i--{
t :=total / i
idx := k / t -1
if k % t !=0{
idx+=1
}
if idx<0{
idx = 0
}
res = append(res,num[idx])
total , k = t , k-t*idx
num = append(num[:idx],num[idx+1:]...)
}
return string(res)
}
代码效率:
执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:2.2 MB, 在所有 Go 提交中击败了100.00%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!