LeetCode - 969. Pancake Sorting

原题:https://leetcode-cn.com/problems/pancake-sorting/
难度:medium

解题思路:题目并不要求找到最优解,任意解即可。这里想到的是类似于冒泡的思路,每次翻转都先把最大的数字翻转到第一位,然后在翻转一次将最大的置于最后,达到冒泡的效果。以给定的测试用例可以进行以下翻转:

  1. k=3,将4置于第一位:4 2 3 1
  2. k=4,此时4置于正确的位置:1 3 2 4
  3. 接下来只需考虑前3个数即可,此时3为前3个数中的最大值,k=2: 3 1 2 4
  4. k=3: 2 1 3 4
  5. k=2: 1 2 3 4,结束
class Solution {
    public List<Integer> pancakeSort(int[] arr) {
        List<Integer> result = new ArrayList<>();
        for(int i = arr.length; i > 1; i --) {
            int idx = findMax(arr, i);
            if(idx == i - 1) {
                continue;
            }
            if(idx != 0) {
                swap(arr, idx + 1);
                result.add(idx + 1);
            }
            result.add(i);
            swap(arr, i);
        }
        return result;
    }

    private int findMax(int[]a, int last) {
        int max = -1;
        int idx = 0;
        for(int i = 0; i < last; i ++) {
            if(a[i] > max) {
                max = a[i];
                idx = i;
            }
        }
        return idx;
    }

    private void swap(int[]a, int last) {
        for(int i = 0; i < last / 2; i ++) {
            int temp = a[i];
            a[i] = a[last - 1 - i];
            a[last - 1 - i] = temp;
        }
    }
}

执行用时: 2 ms , 在所有 Java 提交中击败了 68.67% 的用户
内存消耗: 38.6 MB , 在所有 Java 提交中击败了 68.42% 的用户

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述: 给定数组 A,我们可以对其进行煎饼翻转:我们选择一些正整数 k <= A.length,然后反转 A ...
    周英杰Anita阅读 2,087评论 0 0
  • Outline相向双指针同向双指针 Two SumPartitionSort 0 Templete 同向双指针,相...
    左心Chris阅读 2,622评论 0 0
  • 51. 加法 不使用+、-,计算两数字之和 52. 至少有K个重复字符的最长子串 找到给定字符串(由小写字符组成)...
    毒死预言家的女巫阅读 3,942评论 0 0
  • 当前Leetcode的链表标签题目一共53道题,除了会员题目,题解基本都在这了,还可能陆续更新一题多解~ 简单 (...
    李白开水阅读 3,064评论 0 2
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 12,187评论 16 22