返回

LeetCode 969:煎饼排序——代码大厨烹饪翻转盛宴

前端

LeetCode 969:煎饼排序——用代码烹饪美食

引言

在编程世界中,数组就像我们厨房里的煎饼——它们需要小心处理才能达到完美的排序。LeetCode 969:煎饼排序提供了一种烹饪灵感的方法,通过「煎饼翻转」来对数组进行排序。让我们揭开煎饼排序的神秘面纱,品尝其美味的算法吧!

煎饼排序:烹饪美味的排序

煎饼排序就像是一位熟练的厨师,它使用贪心算法来翻转数组,逐步实现排序。煎饼排序的灵感来自煎饼烹饪,厨师将煎饼翻转过来,确保它们均匀受热并完美烹饪。

煎饼排序的工作原理如下:

  1. 找到最大值: 从数组中找到最大值,并将其「翻转」到数组的最前面。
  2. 再次找到最大值: 从数组剩余部分中找到新的最大值,并将其「翻转」到数组的次前面。
  3. 重复翻转: 继续执行步骤 1 和 2,直到数组完全排序。

代码大厨:煎饼排序的美味佳肴

让我们用代码来品尝煎饼排序的美味:

JavaScript:

const pancakeSort = (arr) => {
  for (let i = arr.length - 1; i >= 1; i--) {
    let maxIndex = findMaxIndex(arr, i);
    flip(arr, maxIndex);
    flip(arr, i);
  }
  return arr;
};

const findMaxIndex = (arr, end) => {
  let maxIndex = 0;
  for (let i = 1; i <= end; i++) {
    if (arr[i] > arr[maxIndex]) {
      maxIndex = i;
    }
  }
  return maxIndex;
};

const flip = (arr, end) => {
  let start = 0;
  while (start < end) {
    [arr[start], arr[end]] = [arr[end], arr[start]];
    start++;
    end--;
  }
};

Python:

def pancake_sort(arr):
    for i in range(len(arr) - 1, 0, -1):
        max_index = find_max_index(arr, i)
        flip(arr, max_index)
        flip(arr, i)
    return arr

def find_max_index(arr, end):
    max_index = 0
    for i in range(1, end + 1):
        if arr[i] > arr[max_index]:
            max_index = i
    return max_index

def flip(arr, end):
    start = 0
    while start < end:
        arr[start], arr[end] = arr[end], arr[start]
        start += 1
        end -= 1

C++:

vector<int> pancakeSort(vector<int>& arr) {
    int n = arr.size();
    for (int i = n - 1; i >= 0; i--) {
        int maxIndex = findMaxIndex(arr, i);
        reverse(arr.begin(), arr.begin() + maxIndex + 1);
        reverse(arr.begin(), arr.begin() + i + 1);
    }
    return arr;
}

int findMaxIndex(vector<int>& arr, int end) {
    int maxIndex = 0;
    for (int i = 1; i <= end; i++) {
        if (arr[i] > arr[maxIndex]) {
            maxIndex = i;
        }
    }
    return maxIndex;
}

Java:

public int[] pancakeSort(int[] arr) {
    int n = arr.length;
    for (int i = n - 1; i >= 0; i--) {
        int maxIndex = findMaxIndex(arr, i);
        flip(arr, maxIndex);
        flip(arr, i);
    }
    return arr;
}

private int findMaxIndex(int[] arr, int end) {
    int maxIndex = 0;
    for (int i = 1; i <= end; i++) {
        if (arr[i] > arr[maxIndex]) {
            maxIndex = i;
        }
    }
    return maxIndex;
}

private void flip(int[] arr, int end) {
    int start = 0;
    while (start < end) {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}

美味应用:煎饼排序的妙用

煎饼排序是一种用途广泛的排序算法,特别适用于以下情况:

  • 数据量较小(通常小于 1000)
  • 数据分布相对均匀,没有极端值

煎饼排序在解决以下问题时表现出色:

  • 对数组进行排序,以便执行某些操作(例如查找最小值)
  • 重排数组以满足特定条件(例如将所有偶数放在数组的前面)
  • 为烹饪爱好者提供灵感,制作出完美的煎饼!

结论

LeetCode 969:煎饼排序是一种巧妙而有效的贪心算法,就像一位熟练的厨师,通过「煎饼翻转」将数组烹饪至完美。它为排序问题提供了一种美味且易于理解的解决方案。下次您需要对数组进行排序时,不妨尝试一下煎饼排序,品尝其美味的效率!