[路飞]_969. 煎饼排序

「这是我参与2022首次更文挑战的第33天,活动详情查看:2022首次更文挑战

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] ,也将被判断为正确。
复制代码

示例3

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

提示

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

题解

模拟 + 指针

煎饼翻转排序,算法能算到煎饼,哈哈。其乐无穷

看了一下示例,有点迷惑。先分析示例给出的数据 a r r = [ 3 , 2 , 4 , 1 ] arr = [3,2,4,1] ,最终排序 a r r = [ 1 , 2 , 3 , 4 ] arr = [1,2,3,4]

煎饼排序是不是可以这样理解:

  • 找到当前数组中最大值 a r r = [ 3 , 2 , 4 , 1 ] arr = [3,2,4,1] 下标 i d x idx ;将数组中 [ 0 , i d x ] [0,idx] 反转,得到: a r r = [ 4 , 2 , 3 , 1 ] arr = [4,2,3,1] ,将整个数组反转,也就是区间 [ 0 , a r r . l e n g t h 1 ] [0,arr.length-1] ,得到: a r r = [ 1 , 3 , 2 , 4 ] arr = [1,3,2,4]
  • 继续,找到当前数组中最大值 a r r = [ 1 , 3 , 2 , 4 ] arr = [1,3,2,4] 下标 i d x idx ;将数组中 [ 0 , i d x ] [0,idx] 反转,得到: a r r = [ 3 , 1 , 2 , 4 ] arr = [3,1,2,4] ,将整个数组-1反转,也就是区间 [ 0 , a r r . l e n g t h 2 ] [0,arr.length-2] ,得到: a r r = [ 2 , 1 , 3 , 4 ] arr = [2,1,3,4]

有点像冒泡排序,每次使用两个【煎饼反转】将最后一个位置放好;时间复杂度 O ( n 2 ) O(n^2) ,还好数组长度小于100,时间复杂度可以接受

根据上述思路编辑代码如下

var pancakeSort = function (arr) {
  const len = arr.length
  let result = []
  for (let i = len - 1; i >= 0; i--) {
    let idx = 0
    let max = arr[0]
    for (let j = 0; j <= i; j++) {
      if (arr[j] > max) {
        max = arr[j]
        idx = j
      }
    }

    reverse(0, idx)
    reverse(0, i)
    result.push(idx+1, i+1)
  }

  return result

  function reverse(left, right) {
    while (left < right) {
      const t = arr[left]
      arr[left] = arr[right]
      arr[right] = t
      left++
      right--
    }
  }
}
复制代码

结语

作者水平有限,如有不足欢迎指正;任何意见和建议欢迎评论区浏览讨论

猜你喜欢

转载自juejin.im/post/7066331924519714824