【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);
    }

};

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值