题目链接:969. 煎饼排序
类似选择排序法,每一步找到序列中最大的元素,将其放在序列末尾:
- 当其本身就在队列末尾时,不操作;
- 当其在序列第一个时,进行一次煎饼翻转即可;
- 否则,需要进行两次煎饼翻转,首先将它反转到序列第一个位置,然后反转到序列最后一个位置。
递归地进行上述操作,每一步完成后,序列的末尾就会增加一个排好序的元素,直到所有的元素都排序完成。
使用这种方法,最坏情况下,需要进行队列长度的两倍的煎饼翻转数量。
from typing import List
class Solution:
def pancake(self, arr: List[int], k: int):
arr[:k] = arr[:k][::-1]
def pancakeSort(self, arr: List[int]) -> List[int]:
n = len(arr)
if n <= 1:
return []
pos = arr.index(n)
if pos == 0:
self.pancake(arr, n)
return [n] + self.pancakeSort(arr[:-1])
elif pos == n - 1:
return self.pancakeSort(arr[:-1])
else:
self.pancake(arr, pos + 1)
self.pancake(arr, n)
return [pos + 1, n] + self.pancakeSort(arr[:-1])