给定数组 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] 的排列
考虑边界问题之后一次AC了。不知道多少年没有一次AC,看看自己的提交百分比就可想而知
思路是LeetCode的官方思路,每次找到最大值的下标,如果已经是最后一位则跳过进行下次比较。
第一次翻转数:最大值得下标
此时可以保证最大值在第一位。
第二次翻转数:数组大小
此时可以保证最大值到最后一位。
例子如下:
3241 (start)
4231 (3)
1324 (4)
3124 (2)
2134 (3)
1234 (2)
个人觉得,还是写复杂了......
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
class Solution {
public:
vector<int> pancakeSort(vector<int>& A) {
int i;
vector<int> res;
while (1) {
int maxVal = 0;
int maxIndex = 0;
for (i = 0; i < A.size(); i++) {
if (maxVal < A[i]) {
maxVal = A[i];
maxIndex = i;
}
}
/* 如果最后只剩下两个元素,且最大在第一位*/
if (maxIndex == 0 && A.size() == 2) {
res.push_back(2);
break;
}
/* 如果最后只剩下一个元素,退出*/
else if (A.size() == 1) {
break;
}
/* 如果本身是最大 */
if (maxIndex == A.size() - 1) {
A.erase(A.end() - 1);
continue;
}
for (i = 0; i <= maxIndex; i++) {
m_stack.push(A[i]);
}
/* 记录翻转,第一次*/
res.push_back(maxIndex + 1);
i = 0;
while (!m_stack.empty()) {
int top = m_stack.top();
m_stack.pop();
A[i] = top;
i++;
}
//ShowPrint(A);
/* 记录翻转,第二次*/
res.push_back(A.size());
i = 0;
while (i != A.size()) {
m_stack.push(A[i]);
i++;
}
i = 0;
while (!m_stack.empty()) {
int top = m_stack.top();
m_stack.pop();
A[i] = top;
i++;
}
A.erase(A.end() - 1);
//ShowPrint(A);
/* 如果最后只剩下一个元素,退出*/
if (A.size() == 1) {
break;
}
}
return res;
}
private:
stack<int> m_stack;
void ShowPrint(vector<int>& A) {
for (int i = 0; i < A.size(); i++) {
cout << A[i] << ",";
}
cout << endl;
}
};
/*
3241 (start)
4231 (3)
1324 (4)
3124 (2)
2134 (3)
1234 (2)
*/
int main() {
Solution* ps = new Solution();
vector<int> A = { 3,2,4,1 };
vector<int> B = { 1,2,3 };
vector<int> res = ps->pancakeSort(A);
cout << "The result:" << endl;
for (int i = 0; i < res.size(); i++) {
cout << res[i] << endl;
}
system("pause");
return 0;
}