LeetCode-Largest Rectangle in Histogram

看起来很简单,实际上超级难的题目呀,

开始怎么想都只能想到O(n^2)的方法,

后来看了一下提示这道题是用栈,

思考了一下写了一个,基本思路算是理解了,

不过关键在于遇到一个小于栈顶的数时,在不断弹出栈中

比该元素大的数的时候要记住弹出元素的个数,所以我写的是用两个

值来表示栈中的一个元素,一个是高度,另一个是个数,

可是这样还有一个问题:每次更新的时候只更新了左边比它大的元素的个数,

当后面再有元素弹出时,这时它右边的这些弹出了的元素的长度就没有被计算,

所以关键问题在于怎么记录一个元素左右比它大的元素的数目,即它的最大长度,

哎,始终想不到比较高效的方式,如果直接给每个元素一个值来记录的话,这样每次

都需要遍历前面的所有元素来更新他们的值,这样复杂度实际上还是n^2.

无奈,只好看大神的解法,看完之后真是豁然开朗,醍醐灌顶,

多简洁高效的做法呀,直接再压入弹出元素数目的新元素就行了,

压入一个元素就等于前面所有元素的长度都加1了嘛,非常高效。

 1 class Solution {
 2 public:
 3     int largestRectangleArea(vector<int> &height) {
 4         // Start typing your C/C++ solution below
 5         // DO NOT write int main() function
 6         if (height.empty()) {
 7             return 0;
 8         }
 9         stack<int> rect;
10         height.push_back(0);
11         int maxarea = 0;
12         for (int i = 0; i < height.size(); ++i) {
13             int count = 0;
14             while (!rect.empty() && rect.top() > height[i]) {
15                 ++count;
16                 maxarea = max(maxarea, count * rect.top());
17                 rect.pop();
18             }
19             while (count--) {
20                 rect.push(height[i]);
21             }
22             rect.push(height[i]);
23         }
24         return maxarea;
25     }
26 };

 

posted @ 2013-09-11 00:09  Exio  阅读(285)  评论(0编辑  收藏  举报