前言
今天的排序思想,是每次找到最大值索引,将他翻转到最前面,再翻转到最后面,每一轮的翻转就逼近最终答案,由于答案不唯一,可以有不同的翻转方案。
题目
源码
class Solution {
public List<Integer> pancakeSort(int[] arr) {
List<Integer> ans=new ArrayList<>();
int index=arr.length-1;
while(index>=0){
int maxIndex=findMaxIndex(arr,index);
if(maxIndex!=index){
// 找到最大的索引,放到最前
ans.add(maxIndex+1);
pancake(arr,maxIndex+1);
// 再放到最后
ans.add(index+1);
pancake(arr,index+1);
}
index--;
}
// 以下两部是剔除无用的翻转,但是其实不做也行(毕竟答案不唯一)
// while(ans.contains(new Integer(1))){
// ans.remove(new Integer(1));
// }
// while(ans.contains(new Integer(0))){
// ans.remove(new Integer(0));
// }
return ans;
}
public static int findMaxIndex(int[]arr,int right){
// 找到最大索引
int max=0;
int maxIndex=0;
for(int i=0;i<=right;i++){
if(arr[i]>max){
max=arr[i];
maxIndex=i;
}
}
return maxIndex;
}
public static void pancake(int arr[],int count){
// 煎饼反转,交换位置
int left=0;
int right=count-1;
while(left<right){
int tmp=arr[left];
arr[left]=arr[right];
arr[right]=tmp;
left++;
right--;
}
}
}