LeetCode - Largest Rectangle in Histogram

来源:互联网 发布:网络嗑瓜子什么意思 编辑:程序博客网 时间:2024/05/28 03:02

https://leetcode.com/problems/largest-rectangle-in-histogram/


这道题,真的好难。。。。。。

其实O(n^2)的方法很简单,就是每个元素往两边扩展,找到比自己小的边界,然后再算以当前元素为高的最大矩阵面积。

O(n)的方法非常巧妙,也超级难理解,先贴代码吧:

public class Solution {    public int largestRectangleArea(int[] height) {        Stack<Integer> stack = new Stack<Integer>();        int[] h = new int[height.length+1];        h = Arrays.copyOf(height, height.length+1);        int max = 0;        int i=0;        while(i<h.length){            if(stack.empty() || h[stack.peek()]<=h[i]){                stack.push(i++);            }            else{                int t = stack.pop();                max = Math.max(max, h[t] * (stack.isEmpty()? i : i-stack.peek()-1));            }        }        return max;    }}

1. 栈里面是递增的元素的下标号,但遇到不递增的下标 i 时,就把栈中比h[i]大的元素pop出来,然后依次算以这些元素为高的矩形面积,注意,这时候栈是递增的,
t = stack.pop();
时, 从[stack.peek()+1, i-1]这个下标区间内的所有高度都是大于等于 t 的,所以以t为高度的最大矩形就是 h[t] * (i - stack.peek() - 1),如果栈这时候为空的话,说明从 [0, i-1]下标区间的高度值都大于等于 t ,这时候以 t 为高度的矩形面积就是 t * i 了。

2. 上面的代码其实也是看的别人的,我默写的。。。。所以他在原来height后面加了一个 0 元素,不然height中最后一个元素入栈后,后面没有比它小的值了,那么栈内现有的元素就得重新列个循环算了。

总之,这解法简直太巧妙,应该多学习这种栈的使用方式。


时间复杂度和空间复杂度都是O(n)

0 0
原创粉丝点击