第三十九天
969 煎饼排序
给你一个整数数组 arr
,请使用 煎饼翻转 完成对数组的排序。
一次煎饼翻转的执行过程如下:
-
选择一个整数
k
,1 <= k <= arr.length
-
反转子数组
arr[0...k-1]
(下标从 0 开始)
例如,arr = [3,2,1,4]
,选择 k = 3
进行一次煎饼翻转,反转子数组[3,2,1]
,得到 arr = [**1**,**2**,**3**,4]
。
以数组形式返回能使 arr
有序的煎饼翻转操作所对应的 k
值序列。任何将数组排序且翻转次数在 10 * arr.length
范围内的有效答案都将被判断为正确。
方法
依照煎饼排序的定义,我们可以考虑依次将每一个数按照如下规则从小到大进行排列:
- 从原数组中找到第
i
个数的下标k
,然后我们将整个数组按k
翻转 - 经过如上操作,我们就将第
i
个数翻转到了数组的头部,然后依据已经排好的元素的数量cnt
,我们翻转cnt
,这样就将上述元素放到了该在的位置
class Solution {
public List<Integer> pancakeSort(int[] arr) {
List<Integer> res = new ArrayList<>();
for (int i = 0; i < arr.length; ++i) {
int index = findIndex(arr, i + 1);
flip(arr ,index);
res.add(index + 1);
if (check(arr)) return res;
flip(arr, index - i);
res.add(index - i + 1);
if (check(arr)) return res;
flip(arr, index);
res.add(index + 1);
if (check(arr)) return res;
}
return res;
}
public boolean check(int[] arr) {
for (int i = 0; i < arr.length; ++i) {
if