题目描述
给定数组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;
}