您的位置:首页 > 其它

LeetCode - Largest Rectangle in Histogram

2015-03-29 01:08 375 查看
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: