LeetCode: Largest Rectangle in Histogram
2014-08-30 14:58
330 查看
思路:O(n^2)很容易超时,不过思路很清晰,就是对于每一个bar,找到左边离它最近、高度比它低的bar,向右也是,这样构成一个最大的矩形,代码如下:
不过很显然,TLE了。
后来,看到有O(n)的解法,详细见这篇博客
主要利用一个栈来存储递增的下标,如果当前元素比栈顶元素指示的bar要低的话,弹栈,并且以当前栈顶的高度计算当前形成的最大矩形。
注意:元素越小,越是靠后出栈,因为需要找到更小的元素才能弹出栈。
code:
class Solution { public: int largestRectangleArea(vector<int> &height) { int n = height.size(); vector<int> left(n,0), right(n,0); for(int i = 0;i < n;i++){ for(int j = i;j >=0;j--) if(height[j] < height[i]){ left[i] = j+1; break; } for(int j = i;j < n;j++) if(height[j] < height[i]){ right[i] = j - 1; break; } } int max_v = 0; for(int i = 0;i < n;i++) max_v = max(max_v,(right[i] - left[i] + 1)*height[i]); return max_v; } };
不过很显然,TLE了。
后来,看到有O(n)的解法,详细见这篇博客
主要利用一个栈来存储递增的下标,如果当前元素比栈顶元素指示的bar要低的话,弹栈,并且以当前栈顶的高度计算当前形成的最大矩形。
注意:元素越小,越是靠后出栈,因为需要找到更小的元素才能弹出栈。
code:
class Solution { public: int largestRectangleArea(vector<int> &height) { height.push_back(0); int n = height.size(); stack<int> hIndex; int i = 0,max_v = 0; while(i < n){ if(hIndex.empty() || height[hIndex.top()] <= height[i]){ hIndex.push(i); ++i; } else{ int curTop = hIndex.top(); hIndex.pop(); if(!hIndex.empty()) max_v = max(max_v,height[curTop] *(i - hIndex.top() - 1)); else// 栈为空,就说明刚刚弹出的元素是数组中最小的元素,这个最小元素当然要乘以长度为 i 来表示矩形面积。 max_v = max(max_v,height[curTop] * i); } } return max_v; } };
相关文章推荐
- [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