冒泡排序 思想 -leetcode-969. 煎饼排序

969. 煎饼排序

题目描述


冒泡排序 思想

参考:彤哥 题解

思路:

  1. 类似于冒泡排序思想:每次排序时,将当前最大的元素扔到当前的末尾,即保证 [ k , n − 1 ] [k, n - 1] [k,n1] 是当前最大值
  2. 当前的最大元素至多经过两次“煎饼交换”,就可以放到最终的位置
    • 将当前最大元素交换到开头(i = 0)处;
    • 再将这个元素从开头交换到 末尾
class Solution {
    public List<Integer> pancakeSort(int[] arr) {
        // 类似于冒泡,先把最大的换到最后面,再把次大的换到次后面,依次进行
        int n = arr.length;
        // last存储“最后一个位置”(非排好序的最后一位)
        int last = n - 1;
        // x 存储当前轮“最大的数”(非排好序的数中最大的)
        int x = n;
        List<Integer> ans = new ArrayList<>();
        while (x != 1) {
            // 先找到 x 的位置
            int k = 0;
            for ( ; arr[k] != x; k++) {}
            // k == last 说明 x 已经在“最后一位”了,进入下一轮
            if (k != last) {
                // 把最大的数换到0号位置了,k==0 时不需要交换
                if (k != 0) {
                    reverse(arr, 0, k);
                    ans.add(k + 1);
                }
                // 把最大的数换到“最后一位”
                reverse(arr, 0, last);
                ans.add(last + 1);
            }
            last--;
            x--;
        }
        return ans;
    }

    // 双指针交换 [left, right] 中元素
    private void reverse(int[] arr, int left, int right) {
        while (left < right) {
            int tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;
            right--;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值