LeetCode-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] 的排列

考虑边界问题之后一次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;
}
发布了245 篇原创文章 · 获赞 57 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_16542775/article/details/103878337