LeetCode第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 范围内的有效答案都将被判断为正确。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pancake-sorting
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

答案

方法一

class Solution {List<Integer> result = new ArrayList<>();public List<Integer> pancakeSort(int[] arr){for (int i = 1; i < arr.length; i++) {int index = get(arr, i);
//            LogUtils.info("i = {}, index = {}", i, index);if (index == 0) {flip(arr, i - 1);flip(arr, i);} else if(index != i){flip(arr, i);flip(arr, i - index);flip(arr, i - index - 1);flip(arr, i);}}return result;}/*** 返回指定数会出现的位置* @param arr* @param end* @return*/public int get(int[] arr, int end){int left = 0;int right = end - 1;while(left <= right){int mid = left + ((right - left) >> 1);if(arr[mid] > arr[end]){right = mid - 1;} else if(arr[mid] < arr[end]){left = mid + 1;} else {return mid;}}return left;}/*** 翻转0~n数组的数值* @param arr* @param end*/public void flip(int [] arr, int end){if(end < 1){return;}result.add(end + 1);int left = 0;int right = end;while(left < right){int mid = arr[left];arr[left] = arr[right];arr[right] = mid;left++;right--;}
//        LogUtils.info("end = {}, arr = {}", end, (Object) arr);}
}

答案解析.将数组分为两个部分,数组左侧为长度为i+1的递增数组,右侧无序数组,每次从右侧无序数组中取出第一个数,并获得该数应当插入到左侧数组的位置index,对index进行判断:

  • 当index == 0时,执行两次翻转,翻转数组0~i-1的数组,然后翻转0~i之间的数组
  • 当index == i时,不执行操作
  • 当index != 0 && index != 0 时,翻转(0~i),(0~i-index),(0~i-index-1),(0~i)

LeetCode第969题 煎饼排序相关推荐

  1. leetcode算法题--煎饼排序

    原题链接:https://leetcode-cn.com/problems/pancake-sorting/ 算法思路: 1.在未排序的数中找出最大的一个数 2.两次排序,将这个数放在最后,这是已经排 ...

  2. java删除有序数组中的重复元素_算法刷刷刷Leetcode第26题删除排序数组中的重复项...

    给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成.示例 ...

  3. Leetcode每日一题总目录(动态更新。。。)

    0. 概要 leecode每日一题(也可能多题)题解跟踪记录及总目录. 常用算法解题思路和技巧及数据结构: 预处理:数组排序(954),哈希表... 双指针法 682,125,905 单向链表 2 双 ...

  4. 【Leetcode】 刷题之路1(python)

    leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...

  5. leetcode贪心算法题集锦(持续更新中)

    leetcode贪心算法题集锦 leetcode贪心算法题集锦(持续更新中).python 和C++编写. 文章目录 leetcode贪心算法题集锦 一.贪心算法 1.盛最多水的容器 2.买股票的最佳 ...

  6. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  7. [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]

    [剑指offer]面试题第[57]题[Leetcode][第167题][第1题] 有序无序之分 题目输出不同之分 以下解法按照[剑指offer]面试题第[57]题进行题解 [问题描述][简单] 输入一 ...

  8. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  9. LeetCode部分刷题笔记!!!JavaScript!!!

    详细解说请看视频JS老毕:人人都能看得懂的Leetcode力扣刷题教程合集 边看视频边记录笔记!!!部分题目在视频中无! 文章目录 LeetCode第1题:1. 两数之和 LeetCode第2题:2. ...

最新文章

  1. 洛谷P3572 [POI2014]PTA-Little Bird
  2. LVM逻辑卷创建管理
  3. WinDbg配置和使用基础
  4. QTreeWidgetItem和QTreeWidgetItemIterator
  5. Java培训教程:Java中的位移运算符!
  6. ie11上vue中使用elementui的input框无法输入中文
  7. WINCE6 同时支持简繁体
  8. 科研这条路:一位数学博士给本科生的建议
  9. 3月第四周全球域名解析商:万网DNSPod排名均上升1名
  10. java过滤lsit重复_java 8 中获取List结合中过滤后的重复数据
  11. 《半吊子全栈系列:Boostrap3》
  12. IT部门不应忽略的12种数据
  13. Windows Server AD修改还原模式密码
  14. 红帆参加HiMSS 2010(2010亚太区卫生信息大会)
  15. 亚马逊alexa智能家电_如何使用Amazon Alexa轻松设置智能家居设备
  16. QA与SQA到底有什么区别和联系?他们的职责和工作内容是什么?QC,QM又是什么?
  17. Wpremig的AH之战题解
  18. txt文本怎么去除重复项
  19. Java趣味编程(一)
  20. 奥迪A6(C5)遥控器钥匙更换电池后无法使用的适配(对码)方法

热门文章

  1. 基于腾讯位置服务获取IP归属地实践
  2. 树莓派用网线直连笔记本电脑
  3. Mysql 死锁问题
  4. codeforces的dp专题
  5. 16. Zuul 源码讲解
  6. 机器人小车的运动模型
  7. 计算机学院软件知识大赛标语,职业生涯规划大赛标语.doc
  8. 2020-12-02 Centos8.2邮件服务器搭建攻略!一文吃透Postfix+Dovecot+MySQL!
  9. 试论运城关公2019通信类EI会议的发展与保护路径
  10. 为什么php是无法加密的,这个php加密研究不出什么家的高手们 能解决?