煎餅排序

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
結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章