Leetcode 969:煎饼排序

题目描述

给定数组A,我们可以对其进行煎饼反转:我们选择一些正整数k <= A.lenght,然后反转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],也将被接受。

解题思路

每一趟,将该趟中最大的元素(位置i)进行反转A[0]到A[i]反转,然后进行当前趟长度反转A[0]到A[len];然后重复这个过程直到序列被排好为止。每一步,我们只需花费两次煎饼反转操作。

void reversal(vector<int>& A,int l,int r){
        while(l <= r){
            swap(A[l],A[r]);
            l++;
            r--;
        }
    }
    int findMax(vector<int>& A,int len){
        int maxn = A[0],maxidx = 0;
        for(int i=0;i<=len;i++){
            if(A[i] > maxn){
                maxn = A[i];
                maxidx = i;
            }
        }
        return maxidx;
    }
    vector<int> pancakeSort(vector<int>& A) {
        vector<int> ans;
        int maxidx = 0,nowlen = A.size()-1;
        for(int i=0;i<A.size();i++){
            maxidx = findMax(A,nowlen);
            if(maxidx != nowlen){
                ans.push_back(maxidx+1);
                reversal(A,0,maxidx);
                reversal(A,0,nowlen);
                ans.push_back(nowlen+1);
            }
            nowlen--;
        }
        return ans;
    }

猜你喜欢

转载自blog.csdn.net/weixin_35338624/article/details/87994156