煎饼排序

flag

软件学院大三党,每天一道算法题,第31天

题目介绍

给定数组 A,我们可以对其进行煎饼翻转:我们选择一些正整数 k <= A.length,然后反转 A 的前 k 个元素的顺序。我们要执行零次或多次煎饼翻转(按顺序一次接一次地进行)以完成对数组 A 的排序。

返回能使 A 排序的煎饼翻转操作所对应的 k 值序列。任何将数组排序且翻转次数在 10 * A.length 范围内的有效答案都将被判断为正确。

1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pancake-sorting

思路

这道题就是采用将前n个数组进行反转的方法,将整个数组从小到大排序。
如何排序:我们可以每次都找到未排序的最大的数,把它放在未排序数组的最后面。
如何把最大的数放在后面:因为是采用的反转的方法,先把最大的数放在最前面,然后再反转过去。

关键代码

    public static List<Integer> pancakeSort(int[] A){
        List<Integer>list=new ArrayList<>();
        int len=A.length;
        int current=len;//当前未排序的最大的数
        while (current>1){
            if(A[0]==current){//current正好在首部,直接把它放在未排序数的末尾
                A=inverse(A,current-1);//前current个数全部翻转,使current到未排序的末尾
                list.add(current);
            }
            else if(A[current-1]!=current){//current不在首部,找到它的位置
                for (int i=0;i<current-1;i++){
                    if(A[i]==current){
                        A=inverse(A,i);//将前i+1个倒序,使current到数组首部
                        list.add(i+1);
                        break;
                    }

                }
                A=inverse(A,current-1);//前current个数全部翻转,使current到未排序的末尾
                list.add(current);
            }
            current--;
        }
        return list;

    }
    public static int [] inverse(int []A,int i){//反转A数组的前i+1个元素
        int []B=new int[i+1];
        for (int j=0;j<i+1;j++){
            B[j]=A[i-j];
        }
        for (int j=0;j<i+1;j++){
            A[j]=B[j];
        }
        return A;
    }

测试

2
结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值