LeetCode - Largest Rectangle in Histogram
2015-03-29 01:08
375 查看
https://leetcode.com/problems/largest-rectangle-in-histogram/
这道题,真的好难。。。。。。
其实O(n^2)的方法很简单,就是每个元素往两边扩展,找到比自己小的边界,然后再算以当前元素为高的最大矩阵面积。
O(n)的方法非常巧妙,也超级难理解,先贴代码吧:
1. 栈里面是递增的元素的下标号,但遇到不递增的下标 i 时,就把栈中比h[i]大的元素pop出来,然后依次算以这些元素为高的矩形面积,注意,这时候栈是递增的,
2. 上面的代码其实也是看的别人的,我默写的。。。。所以他在原来height后面加了一个 0 元素,不然height中最后一个元素入栈后,后面没有比它小的值了,那么栈内现有的元素就得重新列个循环算了。
总之,这解法简直太巧妙,应该多学习这种栈的使用方式。
时间复杂度和空间复杂度都是O(n)
这道题,真的好难。。。。。。
其实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)
相关文章推荐
- [LeetCode] Largest Rectangle in Histogram
- [LeetCode] Largest Rectangle in Histogram 解题报告
- LeetCode —— Largest Rectangle in Histogram
- LeetCode: Largest Rectangle in Histogram(直方图最大面积)
- LeetCode-Largest Rectangle in Histogram
- [LeetCode] Largest Rectangle in Histogram
- leetcode-084:Largest Rectangle in Histogram
- LeetCode 笔记系列 17 Largest Rectangle in Histogram
- [LeetCode] Largest Rectangle in Histogram、Maximal Rectangle
- [leetcode]Largest Rectangle in Histogram
- [Leetcode] Largest Rectangle in Histogram
- LeetCode: Largest Rectangle in Histogram
- [leetcode] Largest Rectangle in Histogram
- [leetcode]Largest Rectangle in Histogram
- LeetCode: Largest Rectangle in Histogram(直方图最大面积)
- leetcode之Largest Rectangle in Histogram
- [Leetcode] Largest Rectangle in Histogram
- leetcode - Largest Rectangle in Histogram
- leetcode -- Largest Rectangle in Histogram TODO O(N)
- LeetCode Online Judge 题目C# 练习 - Largest Rectangle in Histogram