题目概述
找到最短的煎饼排序这种翻转方法来排序的最小翻转次数的问题已经被证明是NP问题,我们用能满足题目限制的方法即可。
注意C++的reverse函数,如果你想翻转(i,j)的元素,那么你得用reverse(i, j + 1)
,i和j是迭代器。
链接:煎饼排序
class Solution {
public:
vector<int> pancakeSort(vector<int>& arr)
{
/*一种类选择排序的思路
我们有一种方法可以把当前数组最大元素放到数组结尾
假设当前数组长度为n 设最大元素的下标为index
如果它的下标就在n - 1 那就不用翻转了 它已经处于正确位置了
首先翻转index + 1 然后这个元素就会到首位
然后翻转n 就是整个数组翻转一下 这个元素就会到末尾
因此每次摆放玩最大元素就让数组长度减1,接着操作
直到数组长度为1为止
这样总共最多会翻转2 * (arr.length - 1)次 是符合题意的*/
vector<int> ret;
for (int n = arr.size(); n > 1; --n)
{
int index = max_element(arr.begin(), arr.begin() + n) - arr.begin();
if (index == n - 1) continue;
reverse(arr.begin(), arr.begin() + index + 1);
reverse(arr.begin(), arr.begin() + n);
ret.push_back(index + 1);
ret.push_back(n);
}
return ret;
}
};
时间复杂度:翻转一次,最多 O ( n ) O(n) O(n), 找一次最大元素,最多 O ( n ) O(n) O(n), 所以时间复杂度为 O ( n 2 ) O(n^2) O(n2)。