单调栈解析

114 阅读1分钟

算法思路:

栈内存放从小到大或者从大到小的数据,比如:计算某个值左右两边都比它小,才能计算,可以使用单调栈,把数推进栈内,遇到小的就计算结果。

场景:

  • 需要找出ABA这个场景,A比B大或者小,就可以以AAAB存储数据,遇到下一个A就可以计算B了。

模版:

循环从左到右的最后一个元素+1While(栈不为空 && 栈顶元素比现有的数据大)
		计算栈顶元素信息
		计算目前到栈顶元素的距离信息
		计算栈顶元素的结果
     把现有的index推进栈里。
返回结果。
        int area = 0;
        for(int i = 0; i <= heights.length; i++) {
            int curH = i == heights.length ? Integer.MIN_VALUE : heights[i];
            while(!stack.isEmpty() && heights[stack.peek()] > curH) {
                int  h = heights[stack.pop()];
                int w = stack.isEmpty()? i : i - stack.peek() - 1;
                area = Math.max(area, h * w);
            }
            stack.push(i);
        }

适用题目:

如果需要一个元素从小到大排列,算出它左右两边比它高或者低的值,可以用单调栈解决。

image.png

分析:接雨水,一个单元的水容量=左边最近比它高的,右边最近比它高的。 因此使用递减栈: 比如:4,3,2,1 1左边是第一个比它高的,而数组下一个遇到比它高的就可以计算它的容水量了。 由于第一个元素和第二个元素不需要计算,下标就到数组的最后一个元素就可以了。

image.png

  • leetcode 84. Largest Rectangle in Histogram 也可以使用单调栈解决。读者可以自己尝试解决一下。