zoukankan      html  css  js  c++  java
  • 969. 煎饼排序

    给定数组 A,我们可以对其进行煎饼翻转:我们选择一些正整数 k <= A.length,然后反转 A 的前 k 个元素的顺序。我们要执行零次或多次煎饼翻转(按顺序一次接一次地进行)以完成对数组 A 的排序。

    返回能使 A 排序的煎饼翻转操作所对应的 k 值序列。任何将数组排序且翻转次数在 10 * A.length 范围内的有效答案都将被判断为正确。

    示例 1:

    输入:[3,2,4,1]
    输出:[4,2,4,3]
    解释:
    我们执行 4 次煎饼翻转,k 值分别为 4,2,4,和 3。
    初始状态 A = [3, 2, 4, 1]
    第一次翻转后 (k=4): A = [1, 4, 2, 3]
    第二次翻转后 (k=2): A = [4, 1, 2, 3]
    第三次翻转后 (k=4): A = [3, 2, 1, 4]
    第四次翻转后 (k=3): A = [1, 2, 3, 4],此时已完成排序。
    示例 2:

    输入:[1,2,3]
    输出:[]
    解释:
    输入已经排序,因此不需要翻转任何内容。
    请注意,其他可能的答案,如[3,3],也将被接受。
     

    提示:

    1 <= A.length <= 100
    A[i] 是 [1, 2, ..., A.length] 的排列

    思路:

      • 此题没有完全标准的答案,只要能在规定的时间范围翻转成功,都可以;
      • 首先,从数组中,找到最大值的下标,将此最大值翻转到数组的首部;
      • 再将其翻转到末尾的位置,即可。

    class Solution {
        public List<Integer> pancakeSort(int[] arr) {
            List<Integer> res = new ArrayList<>();
            for(int i = arr.length - 1; i > 0; i--){
                int idx = findIdx(arr, i);
                res.add(idx + 1); // 最大值翻转到数组首位
                res.add(i + 1); // 从数组首位再翻转到末尾对应的位置
                reverse(arr, 0, idx); //交换
                reverse(arr, 0, i); //交换
            }
            return res;
        }
        public int findIdx(int[] nums, int size){
            int idx = 0;
            for(int i = 0; i <= size; i++){
                if(nums[idx] < nums[i]) idx = i;
            }
            return idx; //返回找到的最大值下标
        }
        public void reverse(int[] nums, int left, int right){
            int tmp;
            while(left < right){ //双指针,更加快速的交换
                tmp = nums[left];
                nums[left] = nums[right];
                nums[right] = tmp;
                left++; right--;
            }
        }
    }
  • 相关阅读:
    Codeforces 787D. Legacy 线段树优化建图+最短路
    Codeforces 1051E. Vasya and Big Integers
    BZOJ3261 最大异或和
    BZOJ3531 SDOI2014 旅行
    洛谷P2468 SDOI 2010 粟粟的书架
    2018 ICPC 焦作网络赛 E.Jiu Yuan Wants to Eat
    HDU6280 From Tree to Graph
    HDU5985 Lucky Coins 概率dp
    (HDU)1334 -- Perfect Cubes (完美立方)
    (HDU)1330 -- Deck (覆盖物)
  • 原文地址:https://www.cnblogs.com/luo-c/p/13971139.html
Copyright © 2011-2022 走看看