Redian新闻
>
LeetCode 力扣官方题解 | 969. 煎饼排序

LeetCode 力扣官方题解 | 969. 煎饼排序

公众号新闻

点击上方蓝字设为星标

下面开始今天的学习~

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 值分别为 424,和 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 = [1234],此时已完成排序。 


 示例 2:


输入:[1,2,3]输出:[]解释:输入已经排序,因此不需要翻转任何内容。请注意,其他可能的答案,如 [3,3] ,也将被判断为正确。


提示:


  • 1 <= arr.length <= 100

  • 1 <= arr[i] <= arr.length

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


解决方案


方法一:类选择排序


思路


设一个元素的下标是 index,我们可以通过两次煎饼排序将它放到尾部:

  • 第一步选择 k = index + 1,然后反转子数组 arr [0...k - 1],此时该元素已经被放到首部。

  • 第二步选择 k = n,其中 n 是数组 arr 的长度,然后反转整个数组,此时该元素已经被放到尾部。


通过以上两步操作,我们可以将当前数组的最大值放到尾部,然后将去掉尾部元素的数组作为新的处理对象,重复以上操作,直到处理对象的长度等于一,此时原数组已经完成排序,且需要的总操作数是 2 × (n − 1),符合题目要求。如果最大值已经在尾部,我们可以省略对应的操作。


代码

C++

class Solution {public:    vector<int> pancakeSort(vector<int>& arr) {        vector<int> ret;        for (int n = arr.size(); n > 1; n--) {            int index = max_element(arr.begin(), arr.begin() + n) - arr.begin();            if (index == n - 1) {                continue;            }            reverse(arr.begin(), arr.begin() + index + 1);            reverse(arr.begin(), arr.begin() + n);            ret.push_back(index + 1);            ret.push_back(n);        }        return ret;    }};


Java

class Solution {    public List<Integer> pancakeSort(int[] arr) {        List<Integer> ret = new ArrayList<Integer>();        for (int n = arr.length; n > 1; n--) {            int index = 0;            for (int i = 1; i < n; i++) {                if (arr[i] >= arr[index]) {                    index = i;                }            }            if (index == n - 1) {                continue;            }            reverse(arr, index);            reverse(arr, n - 1);            ret.add(index + 1);            ret.add(n);        }        return ret;    }
public void reverse(int[] arr, int end) { for (int i = 0, j = end; i < j; i++, j--) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }}


C#

public class Solution {    public IList<int> PancakeSort(int[] arr) {        IList<int> ret = new List<int>();        for (int n = arr.Length; n > 1; n--) {            int index = 0;            for (int i = 1; i < n; i++) {                if (arr[i] >= arr[index]) {                    index = i;                }            }            if (index == n - 1) {                continue;            }            Reverse(arr, index);            Reverse(arr, n - 1);            ret.Add(index + 1);            ret.Add(n);        }        return ret;    }
public void Reverse(int[] arr, int end) { for (int i = 0, j = end; i < j; i++, j--) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }}


C

void reverse(int *arr, int arrSize) {    for (int left = 0, right = arrSize - 1; left < right; left++, right--) {        int tmp = arr[left];        arr[left] = arr[right];        arr[right] = tmp;    }}
int *pancakeSort(int *arr, int arrSize, int *returnSize){ int *ret = (int *)malloc(sizeof(int) * (arrSize - 1) * 2); int retSize = 0; for (int n = arrSize; n > 1; n--) { int index = 0; for (int i = 1; i < n; i++) { if (arr[i] >= arr[index]) { index = i; } } if (index == n - 1) { continue; } reverse(arr, index + 1); reverse(arr, n); ret[retSize++] = index + 1; ret[retSize++] = n; } *returnSize = retSize; return ret;}


JavaScript

var pancakeSort = function(arr) {    const ret = [];    for (let n = arr.length; n > 1; n--) {        let index = 0;        for (let i = 1; i < n; i++) {            if (arr[i] >= arr[index]) {                index = i;            }        }        if (index === n - 1) {            continue;        }        reverse(arr, index);        reverse(arr, n - 1);        ret.push(index + 1);        ret.push(n);    }    return ret;}
const reverse = (arr, end) => { for (let i = 0, j = end; i < j; i++, j--) { let temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }};


Python3

class Solution:    def pancakeSort(self, arr: List[int]) -> List[int]:        ans = []        for n in range(len(arr), 1, -1):            index = 0            for i in range(n):                if arr[i] > arr[index]:                    index = i            if index == n - 1:                continue            m = index            for i in range((m + 1) // 2):                arr[i], arr[m - i] = arr[m - i], arr[i]  # 原地反转            for i in range(n // 2):                arr[i], arr[n - 1 - i] = arr[n - 1 - i], arr[i]  # 原地反转            ans.append(index + 1)            ans.append(n)        return ans


Golang

func pancakeSort(arr []int) (ans []int) {    for n := len(arr); n > 1; n-- {        index := 0        for i, v := range arr[:n] {            if v > arr[index] {                index = i            }        }        if index == n-1 {            continue        }        for i, m := 0, index; i < (m+1)/2; i++ {            arr[i], arr[m-i] = arr[m-i], arr[i]        }        for i := 0; i < n/2; i++ {            arr[i], arr[n-1-i] = arr[n-1-i], arr[i]        }        ans = append(ans, index+1, n)    }    return}


复杂度分析


  • 时间复杂度:O(n2),其中 n 是数组 arr 的大小。总共执行至多 n − 1 次查找最大值,至多 2 × (n − 1) 次反转数组,而查找最大值的时间复杂度是 O(n),反转数组的时间复杂度是 O(n),因此总时间复杂度是 O(n2)。

  • 空间复杂度:O(1)。返回值不计入空间复杂度。




BY /

本文作者:力扣

编辑&版式:Janson

声明:本文归“力扣”版权所有,如需转载请联系。


点个在看,少个bug

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
美国跨性别选手暴力扣杀,女排球员用脸“接球”直接晕倒……LeetCode刷完200道题,我竟然收到了亚麻的拒信...LeetCode 力扣官方题解 | 917. 仅仅反转字母CODE01 推出后,机械革命计划发布新款 CODE GO 程序员本GitHub疯传!求职亚麻的留学生,请立即停止刷LeetCode!LeetCode 力扣官方题解 | 1791. 找出星型图的中心节点《西罗普郡一少年》:15: 别看我的双眼《山居续忆》:第一章:外公外婆及其他:十六、三迁住处LeetCode 力扣官方题解 | 2016. 增量元素之间的最大差值美国跨性别选手暴力扣杀,女排球员“接球”直接晕倒……普麻烦大了,会坐牢吗?力扣特别策划 | 挑战不可能的运算35岁被裁,刷LeetCode变成了自我感动...在 VS Code 和 Codium 中编写 Python 程序 | Linux 中国跨性别选手暴力扣杀,女排球员用脸接球导致脑震荡两周...LeetCode 力扣官方题解 | 838. 推多米诺挑战刷最少的题进大厂!不会刷leetcode的人,救星来了Leetcode出题人,揭秘打工体验!商科留学生转码必备:Leetcode到底该怎么刷?刷力扣题想要做到 Bug Free 需培养怎样的思维?程序员必须要掌握的算法技术要点|附赠力扣大厂面试题另一种“推翻” VS Code 的尝试:JetBrains Fleet 现开放公测力扣秋招全攻略|刷对题、刷好题、刷出好 OfferBikini题都白刷了?Amazon导师亲自为你揭秘LeetCode刷题真相!发现了《Leetcode刷题指南》,我半年成功转码上岸投稿延期 | IEEE ICC 2023(IEEE国际通信会议)IEEE is Your Professional Home - 会员精选视频为你诠释“IEEE如何引领你的专业发展”LeetCode 力扣官方题解 | 537. 复数乘法DeepMind提出通用神经算法学习器,排序、搜索、动态规划全部解决力扣刷题技巧篇|程序员萌新如何高效刷题夏日里的聚会Xcode弃用Bitcode,导致应用体积大幅增加Careers Stalled, China’s Liberal Arts Grads Learn to Code2022傅雷翻译出版奖获奖者揭晓 Le palmarès du Prix Fu Lei 2022 dévoilé
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。