看起来很简单,实际上超级难的题目呀,
开始怎么想都只能想到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 };