LeetCode每日一题(969. Pancake Sorting)

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

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
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值