Given an array of integers arr, sort the array by performing a series of pancake flips.
In one pancake flip we do the following steps:
Choose an integer k where 1 <= k <= arr.length.
Reverse the sub-array arr[0…k-1] (0-indexed).
For example, if arr = [3,2,1,4] and we performed a pancake flip choosing k = 3, we reverse the sub-array [3,2,1], so arr = [1,2,3,4] after the pancake flip at k = 3.
Return an array of the k-values corresponding to a sequence of pancake flips that sort arr. Any valid answer that sorts the array within 10 * arr.length flips will be judged as correct.
Example 1:
Input: arr = [3,2,4,1]
Output: [4,2,4,3]
Explanation:
We perform 4 pancake flips, with k values 4, 2, 4, and 3.
Starting state: arr = [3, 2, 4, 1]
After 1st flip (k = 4): arr = [1, 4, 2, 3]
After 2nd flip (k = 2): arr = [4, 1, 2, 3]
After 3rd flip (k = 4): arr = [3, 2, 1, 4]
After 4th flip (k = 3): arr = [1, 2, 3, 4], which is sorted.
Example 2:
Input: arr = [1,2,3]
Output: []
Explanation: The input is already sorted, so there is no need to flip anything.
Note that other answers, such as [3, 3], would also be accepted.
Constraints:
- 1 <= arr.length <= 100
- 1 <= arr[i] <= arr.length
- All integers in arr are unique (i.e. arr is a permutation of the integers from 1 to arr.length).
当一个问题想不明白的时候, 通常反过来想想会有意想不到的收获。
任何一个非有序数组,根据题中给出的操作方法, 最后一步都是从一个完全倒序的数组变成完全正序的数数(在 length 处做反向操作 arr 整体反向), 那我们就得考虑怎么把一个无序数组变成一个倒序数组, 假设 op(i)为在 i 处做反向操作,即 arr[…i]反向, 我们将一个数从 arr[i]换到 arr[j]的操作一共有两步, 第一步 op(i+1), 第二步 op(j+1), op(i+1)将 arr[i]换到 arr[0], op(j+1)将 arr[0]换到 arr[j], 当然 arr[0]到 arr[j]之间的其他元素也都变化了。我们只需要通过这种方法一步步的将无序数组变换成倒序数组即可。
use std::cmp::Reverse;
use std::collections::BinaryHeap;
impl Solution {
pub fn pancake_sort(mut arr: Vec<i32>) -> Vec<i32> {
let mut heap: BinaryHeap<Reverse<i32>> =
arr.clone().into_iter().map(|v| Reverse(v)).collect();
let mut ans = Vec::new();
for i in (0..arr.len()).rev() {
let Reverse(n) = heap.pop().unwrap();
let pos = arr.iter().position(|&v| v == n).unwrap();
if pos == i {
continue;
}
ans.push(pos as i32 + 1);
ans.push(i as i32 + 1);
let mut j = 0;
let mut k = pos;
while j < k {
arr.swap(j, k);
j += 1;
k -= 1;
}
let mut j = 0;
let mut k = i;
while j < k {
arr.swap(j, k);
j += 1;
k -= 1;
}
}
ans.push(arr.len() as i32);
ans
}
}

这篇博客介绍了如何使用 Pancake Sort 算法对整数数组进行排序。Pancake Sort 是一种有趣的排序算法,它通过一系列翻转操作将数组从无序状态转换为有序状态。博客中提供了具体的实现过程,包括如何找到数组中的最大值并将其放置到正确位置,以及如何通过两次翻转来交换任意两个元素。作者通过示例解释了算法的步骤,并给出了 Rust 语言的代码实现,展示了如何将一个无序数组转换成有序数组的过程。
403

被折叠的 条评论
为什么被折叠?



