LeetCode 969. Pancake Sorting (Medium)

Description:

Given an array A, we can perform a pancake flip: We choose some positive integer k <= A.length, then reverse the order of the first k elements of A. We want to perform zero or more pancake flips (doing them one after another in succession) to sort the array A.

Return the k-values corresponding to a sequence of pancake flips that sort A. Any valid answer that sorts the array within 10 * A.length flips will be judged as correct.

Example 1:
Input: [3,2,4,1]
Output: [4,2,4,3]
Explanation: 
We perform 4 pancake flips, with k values 4, 2, 4, and 3.
Starting state: A = [3, 2, 4, 1]
After 1st flip (k=4): A = [1, 4, 2, 3]
After 2nd flip (k=2): A = [4, 1, 2, 3]
After 3rd flip (k=4): A = [3, 2, 1, 4]
After 4th flip (k=3): A = [1, 2, 3, 4], which is sorted. 
Example 1:
Input: [1,2,3]
Output: []
Explanation: The input is already sorted, so there is no need to flip anything.
Note that other answers, such as [3, 3], would also be accepted.
Note:
1. 1 <= A.length <= 100
2. A[i] is a permutation of [1, 2, ..., A.length]

Analysis:

We can refer to the strategy that is applied in Bubble Sort.
We use a loop to traverse the given array from the end to the start. In each iteration of the loop, we use i i i to denote the index of the current element, then we use another loop to find the max element of A [ 0 ∼ i ] A[0 \sim i] A[0i], we use m a x I n d e x maxIndex maxIndex to denote the index of this max element.
If i ≠ m a x I n d e x i \neq maxIndex i=maxIndex, we do:

  1. Reverse the first ( m a x I n d e x + 1 ) (maxIndex+1) (maxIndex+1) elements, namely A [ 0 ∼ m a x I n d e x ] A[0 \sim maxIndex] A[0maxIndex] (The max element will be in the 0 0 0-th position of the array).
  2. Reverse the first ( i + 1 ) (i+1) (i+1) elements, namely A [ 0 ∼ i ] A[0 \sim i] A[0i] (The max element will be in the i i i-th position of the array).
    在这里插入图片描述

Code:
class Solution {
    public List<Integer> pancakeSort(int[] A) {
        List<Integer> rs = new ArrayList();
        int N = A.length;
        
        for(int i = N-1; i > 0; i--) {
            int maxIndex = i;
            int max = A[maxIndex];
            for(int j = i-1; j >= 0; j--) {
                if(A[j] > max) {
                    maxIndex = j;
                    max = A[maxIndex];
                }
            }
            // reverse
            if(maxIndex != i) { // The max element of A[0~i] is not A[i].
                // We firstly reverse A[0~maxIndex];
                rs.add(maxIndex+1); 
                reverseArray(A, 0, maxIndex);
                // Then we reverse A[0~i];
                rs.add(i+1);
                reverseArray(A, 0, i);
            }
        }
        
        return rs;
    }
    
    public void reverseArray(int[] A, int start, int end) {
        for(int i = 0; i < start + (end-start+1)/2; i++) {
            int temp = A[start+i];
            A[start+i] = A[end-i];
            A[end-i] = temp;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值