969 煎饼排序

本文最后更新于:2021年1月6日 下午

给定数组 A,我们可以对其进行煎饼翻转:我们选择一些正整数 **k** <= A.length,然后反转 A 的前 k 个元素的顺序。我们要执行零次或多次煎饼翻转(按顺序一次接一次地进行)以完成对数组 A 的排序。

返回能使 A 排序的煎饼翻转操作所对应的 k 值序列。任何将数组排序且翻转次数在 10 * A.length 范围内的有效答案都将被判断为正确。

示例 1:

1
2
3
4
5
6
7
8
9
输入:[3,2,4,1]
输出:[4,2,4,3]
解释:
我们执行 4 次煎饼翻转,k 值分别为 424,和 3
初始状态 A = [3, 2, 4, 1]
第一次翻转后 (k=4): A = [1, 4, 2, 3]
第二次翻转后 (k=2): A = [4, 1, 2, 3]
第三次翻转后 (k=4): A = [3, 2, 1, 4]
第四次翻转后 (k=3): A = [1, 2, 3, 4],此时已完成排序。

示例 2:

1
2
3
4
5
输入:[1,2,3]
输出:[]
解释:
输入已经排序,因此不需要翻转任何内容。
请注意,其他可能的答案,如[3,3],也将被接受。

提示:

  1. 1 <= A.length <= 100
  2. A[i][1, 2, ..., A.length] 的排列

Solution

参考:《算法小抄》4.8

  • 递归法,类似于汉诺塔
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# @lc code=start
class Solution:
def pancakeSort(self, arr: List[int]) -> List[int]:
res = []
def pReverse(arr, start, end):
while(start<end):
arr[start],arr[end] = arr[end],arr[start]
start+=1
end-=1

def pSort(arr, n):
if n==1: return
maxCake = 0
maxCakeIndex = 0
for i in range(n):
if arr[i]>maxCake:
maxCake = arr[i]
maxCakeIndex = i
pReverse(arr, 0, maxCakeIndex)
res.append(maxCakeIndex+1)
pReverse(arr, 0, n-1)
res.append(n)
pSort(arr, n-1)

pSort(arr, len(arr))
return res
# @lc code=end

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!