LeetCode刷题,煎饼排序(969)

180 阅读1分钟

煎饼排序

给你一个数组,你可以翻转数组前N位,进行排序,返回排序后的你每次进行翻转的下标(最后一位) 如:[1,3,2,4] = [4,2,3,1] 此时记录4,因为我们是从数组第四位(数组下标+1)进行翻转的。

解题代码

思路:找到数组中最大值,将其翻转至数组头部,然后再翻转到数组尾部,下一次就找次大值,再次翻转到数组头部,然后翻转到数组最大值前一位下标,依次遍历翻转即可。[3,1,2,4] -> [2,1,3,4] -> [1,2,3,4]

var reverse = function(arr, n, indArr) {
  for (let i = 0, j = n - 1; i < j; i++, j--){
    [arr[i], arr[j]] = [arr[j], arr[i]]; // 交换两个位置的值
    indArr[arr[i]] = i; // 重新赋值
    indArr[arr[j]] = j;
  }
}
var pancakeSort = function(arr) {
  const indArr = new Array(arr.length + 1); // 记录每个值的下标
  const ret = [];
  for (let i = 0; i < arr.length; i++) {
    indArr[arr[i]] = i; // 把每个值的下标存储起来
  }
  for (let i = arr.length; i >=1; i--) { // 对每个数字进行排序
    if (indArr[i] === i - 1) continue;
    if (indArr[i] + 1 !== 1){
      ret.push(indArr[i] + 1); // 把arr的值的下标添加进去
      reverse(arr, indArr[i] + 1, indArr); // 翻转
    }
    if (i !== 1) {
      ret.push(i); // 添加下标
      reverse(arr, i ,indArr); // 翻转
    } 
  }
  return ret;
}