「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」
题解: leetcode-煎饼排序
给你一个整数数组
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范围内的有效答案都将被判断为正确。
示例:
输入:[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指向前移
}
}
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;
}
灵魂总结:
想要把饼烙好,得会翻!!
👆 👆 以上就是个人对【最长递增子序列】的代码解法和方法解读。
如果能够解开您的迷惑,不要忘记一键三连哟!!!
完成代码请移步: 稍后添加😀
\