1. 程式人生 > >【leetcode 969】 煎餅排序(選擇排序)

【leetcode 969】 煎餅排序(選擇排序)

題意:

給定一個序列,每次只允許翻轉序列的前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);
    }

};