标签:arr Sorting int No.969 maxValue maxIndex Pancake ans rightIndex
969. 煎饼排序 - 力扣(LeetCode) (leetcode-cn.com)
从arr[]的末尾开始,逐个区间地去将对应区间的最大数字翻转到区间的末尾,reverse函数负责找出区间的最大数字,并通过两次翻转:
1、maxValue翻转到0,
2、maxValue从位置0翻转到区间末尾
注意返回的值是k,翻转的最大下标路径
public class Num969 { public static void main(String[] args) { int[] arr = {3,2,4,1}; List<Integer> ans = pancakeSort(arr); for(int number:ans){ System.out.print(number + " "); } } //这道题没有啥次数限制,就每次都把最大的那个数字找出来 public static List<Integer> pancakeSort(int[] arr) { List<Integer> ans = new ArrayList<>(); int len = arr.length; for(int i=len-1; i>=0; i--){ // 从区间上找,每次找当前区间的最大值,并将其反转到区间的最末尾 int rightIndex = i; reverse(arr, rightIndex, ans); } return ans; } public static void reverse(int[] arr, int rightIndex, List<Integer> ans){ // 最小的Index始终是0 int maxValue = arr[0]; int maxIndex = 0; for(int i=0; i<=rightIndex; i++){ // 找出[0, maxIndex]区间的最大值 if(arr[i] > maxValue){ maxValue = arr[i]; maxIndex = i; } } if(maxIndex == rightIndex){ //最大数已经在区间最右侧 return; } if(maxIndex!=0){ ans.add(maxIndex+1); } //反转子数组,两步: 1)先转到0 2)在转到rightIndex的位置 int left = 0; int right = maxIndex; while (left<right){ int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } ans.add(rightIndex+1); left = 0; right = rightIndex; while (left<right){ int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } } }
标签:arr,Sorting,int,No.969,maxValue,maxIndex,Pancake,ans,rightIndex 来源: https://www.cnblogs.com/charonkk/p/15416793.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。