[路飞]_算法·每日解读--煎饼排序

197 阅读2分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

题解: leetcode-煎饼排序

给你一个整数数组 arr ,请使用 煎饼翻转 完成对数组的排序。

一次煎饼翻转的执行过程如下:

  • 选择一个整数 k1 <= 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 范围内的有效答案都将被判断为正确。

示例:

输入:[3,2,4,1]
输出:[4,2,4,3]

题意理解==> 在使用煎饼排序的过程中,要使排序更快速的完成,首先要确定每次翻转的k的最佳情况

在这里,找出最大数的下标

function getMaxIndex(nums){
    let max = 0;
    for(let i = 1; i < nums.length; i++){
        if(nums[i] > nums[max]){
            max = i;
        }
    }
    return max;
}

j接下来编写翻转函数,反转前K个元素

var reverse = function (arr, k){
    //如果给定的K值小于1,直接返回,不执行反转
    if(k < 1){
        return;
    }
    let i = 0,
        j = k;
    while(i < j){ //只需比较左下标和右下标的值即可
        [arr[i], arr[j]] = [arr[j], arr[i]];//交换头和尾的字符
        i++;    //将左指向后移
        j--;    //将给定k指向前移
    }
}
  1. getMaxIndex函数和reverse函数拆分完成后,接下来进行主函数的编写
var pancakeSort = function(arr){
    let ans = [],
        max;
    while(arr.length > 1){
        max = getMaxIndex(arr);
        max > 0 && anns.push(max+1) //将max的对应的下标,添加到ans中 等同于下面if语句
        /*
        if(max>0){
            ans.push(max+1);
        }
        */
        reverse(arr, max);  //翻转前k个元素,反转后第k大(最大)元素,排到头部
        reverse(arr, arr.length-1);  //再次执行翻转,将max设置为arr.length-1,翻转后最大值被调整到尾部
        ans.push(arr.length);  //记录上一步的翻转,max也就是arr.length-1+1;
        //完成以上翻转后,将最大值pop,转为下一个最大值依次执行
        arr.pop();  //当剩下最后一个时,也就是头部第一个
    }
    return ans;
}

灵魂总结:

想要把饼烙好,得会翻!!

👆 👆 以上就是个人对【最长递增子序列】的代码解法和方法解读。

如果能够解开您的迷惑,不要忘记一键三连哟!!!

完成代码请移步: 稍后添加😀

\