返回

只有过程,只有坚持,才能一步步走向目标!煎饼排序,离成功越来越近!

前端

题目概述

LeetCode 969. 煎饼排序给定一个整数数组arr,请使用煎饼翻转完成对数组的排序。

一次煎饼翻转的执行过程如下:

  1. 选择一个整数k,1 <= k <= arr.length
  2. 反转子数组arr[1, k]

煎饼排序算法的核心思想是:通过反复地将煎饼从底部翻转到顶部,将最大的煎饼移到最顶端,然后依次将次大的煎饼移到次顶端,以此类推,最终将整个煎饼栈排序。

煎饼排序算法的实现步骤

  1. 从数组arr的末尾开始遍历,找到最大值max_index
  2. 如果max_index != arr.length - 1,则进行以下操作:
    • 将子数组arr[1, max_index]反转
    • 将子数组arr[1, arr.length - 1]反转
  3. 将arr[arr.length - 1]从数组中移除
  4. 重复步骤1-3,直到arr只剩下一个元素

煎饼排序算法的时间复杂度和空间复杂度

时间复杂度

煎饼排序算法的时间复杂度为O(n^2)。

这是因为,在最坏的情况下,煎饼排序算法需要对数组进行n次翻转,每次翻转都需要O(n)的时间。因此,煎饼排序算法的时间复杂度为O(n^2)。

空间复杂度

煎饼排序算法的空间复杂度为O(1)。

这是因为,煎饼排序算法不需要额外的空间来存储数据。它只需要使用原数组arr来进行排序。因此,煎饼排序算法的空间复杂度为O(1)。

LeetCode 969题的详细题解和示例代码

def pancakeSort(arr):
  """
  :type arr: List[int]
  :rtype: List[int]
  """
  result = []
  for i in range(len(arr) - 1, 0, -1):
    max_index = 0
    for j in range(1, i + 1):
      if arr[j] > arr[max_index]:
        max_index = j

    if max_index != i:
      result.append(max_index + 1)
      arr[:max_index + 1] = arr[:max_index + 1][::-1]
      result.append(i + 1)
      arr[:i + 1] = arr[:i + 1][::-1]

  return result


arr = [3, 2, 4, 1]
print(pancakeSort(arr))

输出结果:

[4, 2, 4, 3, 1]

结语

煎饼排序算法是一种简单易懂、空间复杂度低、时间复杂度为O(n^2)的排序算法。它特别适合对小规模的数据进行排序。如果您正在寻找一种简单易用的排序算法,那么煎饼排序算法是一个不错的选择。