链接
题目.
难度:
middle
解答:
思路一开始就是对了的,就是确定每一个位置上应该怎样取值,但是有一点没注意,当剩余的k <= subCnt的时候应该交由下一步来处理
package main
import "fmt"
func helper(permu, permuCnts []int, k int) {
//fmt.Println(permu, permuCnts, k)
if k == permuCnts[0] {
for i, j := 0, len(permu)-1; i < j; i, j = i+1, j-1 {
permu[i], permu[j] = permu[j], permu[i]
}
return
}
subCnt := permuCnts[1]
if k <= subCnt {
helper(permu[1:], permuCnts[1:], k)
return
}
for i := 1; i < len(permu); i++ {
if (k - subCnt*i) <= subCnt {
tmp := permu[i]
for j := i - 1; j >= 1; j-- {
permu[j+1] = permu[j]
}
permu[0], permu[1] = tmp, permu[0]
helper(permu[1:], permuCnts[1:], k-subCnt*i)
return
}
}
}
func getPermutation(n int, k int) string {
permu := make([]int, n)
for i := 0; i < n; i++ {
permu[i] = i + 1
}
permuCnts := make([]int, n)
permuCnts[n-1] = 1
for i, j := n-2, 2; i >= 0; i, j = i-1, j+1 {
permuCnts[i] = j * permuCnts[i+1]
}
if k > permuCnts[0] {
panic("k too large")
}
helper(permu, permuCnts, k)
result := make([]byte, n)
for i := 0; i < n; i++ {
result[i] = byte(permu[i]) + '0'
}
return string(result)
}
func main() {
fmt.Println(getPermutation(3, 4))
}
复杂度分析
time
O(n)
space
O(1)
执行结果
执行用时 :
0 ms
, 在所有 golang 提交中击败了
100.00%
的用户
内存消耗 :
2 MB
, 在所有 golang 提交中击败了
64.86%
的用户