Skip to content

Commit 1c0505a

Browse files
Create solution.go
1 parent 7c6fb30 commit 1c0505a

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
func permute(n int, k int64) []int {
2+
var f [105]int64
3+
f[0] = 1
4+
for i := 1; i <= n; i++ {
5+
if f[i-1] >= k {
6+
f[i] = k
7+
} else {
8+
f[i] = f[i-1] * int64((i+1)>>1)
9+
}
10+
}
11+
if n%2 == 0 {
12+
f[n] *= 2
13+
}
14+
if f[n] < k {
15+
return []int{}
16+
}
17+
k--
18+
ans := make([]int, n)
19+
a := [2][]int{}
20+
for i := 0; i < n; i++ {
21+
a[i&1] = append(a[i&1], i)
22+
}
23+
24+
if n%2 == 1 {
25+
ans[0] = int(k/f[n-1]) * 2
26+
k -= int64(ans[0]/2) * f[n-1]
27+
} else {
28+
ans[0] = int(k / f[n-1])
29+
k -= int64(ans[0]) * f[n-1]
30+
}
31+
32+
index := sort.SearchInts(a[ans[0]&1], ans[0])
33+
a[ans[0]&1] = append(a[ans[0]&1][:index], a[ans[0]&1][index+1:]...)
34+
35+
for i := 1; i < n; i++ {
36+
if n%2 == 1 {
37+
ans[i] = a[i&1][k/f[n-i-1]]
38+
} else {
39+
ans[i] = a[(ans[0]^i)&1][k/f[n-i-1]]
40+
}
41+
k %= f[n-i-1]
42+
43+
index = sort.SearchInts(a[ans[i]&1], ans[i])
44+
a[ans[i]&1] = append(a[ans[i]&1][:index], a[ans[i]&1][index+1:]...)
45+
}
46+
47+
for i := 0; i < n; i++ {
48+
ans[i]++
49+
}
50+
return ans
51+
}

0 commit comments

Comments
 (0)