Loading

力扣 - 768. 最多能完成排序的块II

题目

768. 最多能完成排序的块 II

思路

  • 利用单调递减栈来解题
    • 遍历数组,将元素存入栈中,再利用max记录当前栈顶的最大值
    • 如果遇到比当前栈元素大的值,那么可以直接入栈,因为可以单独分一块;但是如果遇到比当前栈顶元素小的值,那么应该将之前的元素依次出栈,直到遇到小于等于该值的元素停止出栈,然后将max再push入栈(push的这个max就代表了这一个块)
      • 例如:有该数组 {1, 1, 3, 4, 5, 2, 6, 7},此时栈为
      • 接下来遍历到2了,2比max即5小,所以开始出栈,顺序是:5、4、3,由于1小于2,所以停止出栈,接下来将max(5)入栈,此时栈为:
    • 不断遍历,直到数组遍历结束,此时栈中有多少个元素就代表有多少个块了
  • 分块规则:后一块元素的最小值大于等于前一块元素的最大值

代码

class Solution {
    public int maxChunksToSorted(int[] arr) {
        Deque<Integer> stack = new  LinkedList<Integer>();
        int max = -1;
        
        for (int i = 0; i < arr.length; i++){
            if (!stack.isEmpty() && arr[i] < arr[max]) {
                while (!stack.isEmpty() && arr[i] < arr[stack.peek()]) {
                    stack.pop() ;
                }
                // 此处不能stack.push(i),push的必须是这一组的最大值
                stack.push(max);
            } else {
                stack.push(i);
                max = stack.peek();
            }
        }
        
        return stack.size();
    }
}

复杂度分析

  • 时间复杂度:\(O(N)\), N 为数组长度
  • 空间复杂度:\(O(N)\),N为栈的大小
posted @ 2020-11-06 23:22  linzeliang  阅读(129)  评论(0)    收藏  举报