「每日LeetCode」2022年2月19日

本文最后更新于:2023年3月19日 晚上

  1. 煎饼排序

969. 煎饼排序

给你一个整数数组 arr ,请使用 煎饼翻转_ _完成对数组的排序。
一次煎饼翻转的执行过程如下:

  • 选择一个整数 k ,1 <= k <= arr.length
  • 反转子数组 arr[0…k-1](下标从 0 开始

例如,arr = [3,2,1,4] ,选择 k = 3 进行一次煎饼翻转,反转子数组 [3,2,1] ,得到 arr = [1,2,3,4] 。
以数组形式返回能使 arr 有序的煎饼翻转操作所对应的 k 值序列。任何将数组排序且翻转次数在 10 * arr.length 范围内的有效答案都将被判断为正确。

示例 1:
输入:[3,2,4,1] 输出:[4,2,4,3] 解释: 我们执行 4 次煎饼翻转,k 值分别为 4,2,4,和 3。 初始状态 arr = [3, 2, 4, 1] 第一次翻转后(k = 4):arr = [1, 4, 2, 3] 第二次翻转后(k = 2):arr = [4, 1, 2, 3] 第三次翻转后(k = 4):arr = [3, 2, 1, 4] 第四次翻转后(k = 3):arr = [1, 2, 3, 4],此时已完成排序。
示例 2:
输入:[1,2,3] 输出:[] **解释: **输入已经排序,因此不需要翻转任何内容。 请注意,其他可能的答案,如 [3,3] ,也将被判断为正确。

提示:

  • 1 <= arr.length <= 100
  • 1 <= arr[i] <= arr.length
  • arr 中的所有整数互不相同(即,arr 是从 1 到 arr.length 整数的一个排列)

思路

共有 n 个元素,在下标 0 到 n-1 中最大的数的下标 index,将[0,index]部分反转,再将[0,n-1]反转,总共反转两次可以将最大的数放置到下标 n-1 处。此时最后一个元素已排序完成,只需要再对 0 到 n-2 里的元素进行排序即可,每次排序都不会影响右边已经排好的元素。

解答

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
28
/**
* @param {number[]} arr
* @return {number[]}
*/
var pancakeSort = function (arr) {
let n = arr.length,
res = [];
while (n) {
let max = -Infinity,
index = -1;
for (let i = 0; i < n; i++) {
const num = arr[i];
if (num > max) {
index = i;
max = num;
}
}
res.push(index + 1);
arr = arr
.slice(0, index + 1)
.reverse()
.concat(arr.slice(index + 1));
res.push(n);
arr = arr.slice(0, n).reverse().concat(arr.slice(n));
n--;
}
return res;
};