我从网站上查看过,这称为单峰排列,它定义为只有一个局部最大值的序列。例如n = 5:
12345
12354
12453
12543
13452
13542
14532
15432
23451
23541
24531
25431
34521
35421
45321
54321
是否有算法来获得第k个单峰排列?
答案 0 :(得分:8)
这里的技巧是将序列索引为二进制
1234
----
12345 (0000)
12354 (0001)
12453 (0010)
12543 (0011)
13452 (0100)
13542 (0101)
14532 (0110)
15432 (0111)
23451 (1000)
23541 (1001)
24531 (1010)
25431 (1011)
34521 (1100)
35421 (1101)
45321 (1110)
54321 (1111)
然后观察数字1..4出现在5之前,当且仅当它们的位为0.在Python中:
def kth_unimodal(n, k): # k is 0-indexed
left = []
right = []
for j in range(1, n): # 1..n-1
if k & (1 << (n - 1 - j)):
right.append(j)
else:
left.append(j)
left.append(n)
left.extend(reversed(right))
return left