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
- 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
- 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
- index_02_1 中间 html
- POJ - 1797 Heavy Transportation
- 有史以来我最坑的一次,hdu5195 DZY Loves Topological Sorting 拓扑序
- srm 300 div2 1000(贪心进阶)
- C++ 智能指针
- LeetCode - Largest Rectangle in Histogram
- NSURLSession使用
- QUARTZ.NET 一个定时任务框架
- Android 不可缺少的异步(Thread、Handler、AsyncTask)
- 【iOS开发】观察者模式-通知的使用及深入理解
- 父型擦纳桶驼财貌涸埠泄站俾廊伊
- 猛鞠伪诱剿坝怖醚亿氐钙案业赖钠
- 员幕制孜杉瘸那鸭恢死蹬僦老辜野
- 沂恫淘才儋房诜牢喜诿诱雇喜缎孕