直方图最大矩形面积_栈

 

 思路:

遍历数组

用栈存储一个递增的数组下标,当出现小于最大值时,一次弹出栈,以弹出值高度乘以当前遍历数组位置的i的距离,判断最大值与否

class Solution {
    public int largestRectangleArea(int[] heights) {
        int maxare = 0;
        Deque<Integer> sta = new LinkedList<>();
        sta.addLast(-1);
        for(int i = 0;i < heights.length; i++){
            while(sta.peekLast() != -1 && heights[sta.peekLast()] > heights[i]){
                // int index = sta.pollLast();
                int height = heights[sta.pollLast()];
                maxare = Math.max(maxare,height*(i-sta.peekLast()-1));
            }
            sta.addLast(i);
        }

        while(sta.peekLast() != -1){
            int height = heights[sta.pollLast()];
            maxare = Math.max(maxare,height * (heights.length - sta.peekLast()-1));
        }
        return maxare;
    }
}

我一开始时出现的问题,最终结果没有以最小高乘以当前数组总个数

看题解后,在栈顶先压入一个-1,最后遍历栈中剩余递增数时,数组总长度减栈顶的-1再+1得到的是数组总个数,因为前面已经规划出栈中是一个递增值,所以最后一个元素一定是最小值。