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 协议 ,转载请注明出处!