84. Largest Rectangle in Histogram

Posted reboot329

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了84. Largest Rectangle in Histogram相关的知识,希望对你有一定的参考价值。


July-27-2019

这个题做了好久,面试遇到就跪了,只会暴力解。
而且也讲不明白。简单说就是用stack保证递增:
添加2,下一个是1,不递增了,POP出2然后算结果是乘积是2.
继续添加1 5 6,然后下一个是2,不递增了,POP出6和5算乘积是6和10.
添加2和3,此时STACK里是123,没了。
POP出3 和 2,乘积是3和4.
底的计算方式是当前I-高的

重点是最后一个POP出的元素,是目前为止最小的,就是1,要乘以总长度,从0到6。可以把ARRAY加一个0放到最后,这样最后总会POP出一次。

我在最后一个元素的地方想了很久,比如把图里的1换成0,还对不对了?
[2,0,5,6,2,3]

结果还是对的,然而我想不明白为什么是对的,结果上来说确实是,2*4=8不影响。不管有多少个0在里面都不影响,有0的区别就是0永远POP不出来,最后计算就没有总长度那一次了。

这个题做得还是蛮绝望的。

    public int largestRectangleArea(int[] heights) 
        if (heights.length == 0) return 0;
        ArrayDeque<Integer> stk = new ArrayDeque<>();
        int res = 0;
        heights = Arrays.copyOf(heights, heights.length + 1);
        heights[heights.length - 1] = 0;
        for (int i = 0; i < heights.length; i++) 
            if (stk.isEmpty() || heights[stk.peek()] < heights[i]) 
                stk.push(i);
             else 
                int tempH = heights[stk.pop()];
                int base = 0;
                if (stk.isEmpty()) 
                    base = i;
                 else 
                    base = i - stk.peek() - 1;
                
                res = Math.max(res, base * tempH);
                i -- ;
            
        

        return res;
    

以上是关于84. Largest Rectangle in Histogram的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 84. Largest Rectangle in Histogram

leetcode 84. Largest Rectangle in Histogram

84. Largest Rectangle in Histogram. 单调栈

84. Largest Rectangle in Histogram. 单调栈

leetcode 84. Largest Rectangle in Histogram

Leetcode 84: Largest Rectangle in Histogram