递归实现煎饼排序

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

 1 /*
 2 * https://leetcode-cn.com/problems/pancake-sorting/
 3 * 
 4 * 给定数组 A,我们可以对其进行煎饼翻转:我们选择一些正整数 k <= A.length,然后反转 A 的前 k 个元素的顺序。
 5 * 我们要执行零次或多次煎饼翻转(按顺序一次接一次地进行)以完成对数组 A 的排序。
 6 * 返回能使 A 排序的煎饼翻转操作所对应的 k 值序列。任何将数组排序且翻转次数在 10 * A.length 范围内的有效答案都将被判断为正确。
 7 */
 8 import java.util.ArrayList;
 9 import java.util.List;
10 
11 public class code969_PancakeSorting
12 {
13     List<Integer> res = new ArrayList<>();
14     public List<Integer> pancakeSort(int[] A) {
15         sort(A, A.length);
16         System.out.println(res);
17         return res;
18     }
19     public void sort(int[] nums, int n){
20         if(n == 1)
21             return;
22         int maxNum = 0;
23         int maxNumIndex = 0;
24         for(int i = 0; i < n; i++){
25             if(nums[i] > maxNum){
26                 maxNum = nums[i];
27                 maxNumIndex = i;
28             }
29         }
30         reverse(nums, 0, maxNumIndex);
31         res.add(maxNumIndex + 1);
32         reverse(nums, 0, n - 1);
33         res.add(n);
34         sort(nums, n - 1);
35     }
36     public void reverse(int[] nums, int start, int end){
37         while(start < end){
38             int temp = nums[start];
39             nums[start++] = nums[end];
40             nums[end--] = temp;
41         }
42     }
43     public static void main(String[] args){
44         code969_PancakeSorting pancakeSorting = new code969_PancakeSorting();
45         pancakeSorting.pancakeSort(new int[]{3,2,4,1});
46         //4 2 3 1 3
47         //1 3 2 4 4
48         //3 1 2 4 2
49         //2 1 3 4 3
50         //2 1 3 4 1
51         //1 2 3 4 2
52     }
53 }

猜你喜欢

转载自www.cnblogs.com/Z-D-/p/12639909.html