题意:
给定一个序列,每次只允许翻转序列的前K个元素,求一个翻转的序列K,使得原序列有序。
思路:
一开始真心没有思路。
参照选择排序的思路,每次找到当前序列的最大值X,然后翻转两次把X放到最后面就行了。最多需要翻转2*N次。
怎么样两次把最大值放到后面呢,假设最大值在index,先翻转index,那么最大值就到了第一个,在翻转未排好序的部分,那么未排好序的部分的最大值就到了未排好序的最后一个位置。即可。
class Solution
{
public:
int num = 0;
vector<int>ve;
vector<int> pancakeSort(vector<int>& A)
{
num = 0;
ve.clear();
if(A.size()==1)
return ve;
get_ans(A);
return ve;
}
void get_ans(vector<int>& A)
{
int sz = A.size();
int ma = 0,index=0;
for(int i=0; i<sz-num; i++) //找最大值和其下标
{
if(A[i]>ma)
{
ma = A[i];
index = i;
}
}
ve.push_back(index+1);
ve.push_back(sz-num);
if(num+1==sz-1)
return ;
vector<int>ans;
for(int i=sz-num-1; i>index; i--)
{
ans.push_back(A[i]);
}
for(int i=0; i<index; i++) //把最大值之后的,已排好序之前的数字放入,只翻转了一次,顺序需要改变
ans.push_back(A[i]);
ans.push_back(A[index]);
for(int i=sz-num; i<sz; i++) //把在最大值之前的数字放入,因为翻转了两次,所以原顺序不变
ans.push_back(A[i]);
num++;
get_ans(ans);
}
};