flag
軟件學院大三黨,每天一道算法題,第31天
題目介紹
給定數組 A,我們可以對其進行煎餅翻轉:我們選擇一些正整數 k <= A.length,然後反轉 A 的前 k 個元素的順序。我們要執行零次或多次煎餅翻轉(按順序一次接一次地進行)以完成對數組 A 的排序。
返回能使 A 排序的煎餅翻轉操作所對應的 k 值序列。任何將數組排序且翻轉次數在 10 * A.length 範圍內的有效答案都將被判斷爲正確。
來源:力扣(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;
}
測試
結果: