LeetCode 969. 煎饼排序

122 阅读1分钟

这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

leetcode地址: leetcode-cn.com/problems/pa…

image.png

class Solution {

    boolean isSorted(int[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            if (array[i] > array[i + 1])
                return false;
        }
        return true;
    }

    public List<Integer> pancakeSort(int[] arr) {
        List<Integer> result = new ArrayList<>();
        int length = arr.length;
        for (int i = length - 1; i >= 0; i--) {
            if (isSorted(arr)) return result;
            int maxIndex = 0;
            // 先找最大值
            for (int j = 0; j <= i; j++) {
                if (arr[maxIndex] < arr[j]) {
                    maxIndex = j;
                }
            }
            // 翻转0-maxIndex
            reverse(arr, 0, maxIndex);
            result.add(maxIndex + 1);
            // 翻转0-i
            reverse(arr, 0, i);
            result.add(i + 1);
        }
        return result;
    }

    public void reverse(int[] arr, int i, int j) {
        while (i < j) {
            int temp = arr[i];
            arr[i++] = arr[j];
            arr[j--] = temp;
        }
    }
}

思路: 煎饼排序简单解释就是对于数组的某一段进行翻转, 使逐渐排好序. 根据这个特性, 可以使用冒泡排序的思维, 先从后开始循环n次(数组长度), 每次找到最大的值, 然后翻转到指针指向位, 逐步排好序即可
官方[3,2,4,1] => 可为[3, 4, 2, 3, 1, 2]
如图:

image.png