一图看懂单调栈

单调栈

用于寻找数组中元素向左或向右第一个比该元素小(或大)的元素的索引,每个元素出栈入栈一次,时间复杂度O(n)

单调递增栈

基本形式如下:

for(int i = 0; i < T.size(); i++){
  while(!stk.empty() && stk.peek() >= T[i]){
    stk.pop();
  }
  stk.push(A[i]); //注意一定要在在while()后将后来的元素入栈
}

一图看懂单调栈_第1张图片
要点:

  • 出栈时,栈中该元素左边的元素是从该元素起向左,遇到的第一个小于它的元素;

  • 即将要入栈的元素是从该元素起向右,第一个小于等于它的元素

例题

leetcode 84 柱状图中最大的矩形

class Solution {
    public int largestRectangleArea(int[] heights) {
        Stack<Integer> stack = new Stack<>();
        stack.push(-1); //最先入栈-1,代表0左边的索引是 -1 ,计算面积用
        				//注意入栈的是柱状图的索引
        int res = 0;
        for(int i = 0; i < heights.length; i++){
            while(stack.peek() != -1 && heights[i] <= heights[stack.peek()]){
                int tmp = heights[stack.pop()] * (i - stack.peek() - 1);
                res = Math.max(tmp,res);
            }
            stack.push(i);
        }
        
        while(stack.peek() != -1){
            int tmp = heights[stack.pop()] * (heights.length - stack.peek() - 1);
            res = Math.max(tmp,res);
        }
        return res;
    }
}

你可能感兴趣的:(编程基础,算法,数据结构)