题目:
分析:
我的思路:
上述数组进行这样的标注,然后反着找答案。
嗯,时间复杂度仅仅是2次遍历数组。
很棒!!!
看题解:单调栈。
自己再想想吧!
看题解:讲的很明白了。
一个小的贪心:最优解的高度一定是某一柱子的高度。
代码:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
if(heights.size()==0) return 0;
vector<int> v1(heights.size(),0);
vector<int> v2(heights.size(),0);
stack<int> s1;
v1[0]=-1;
s1.push(0);
for(int i=1;i<heights.size();i++)
{
while(!s1.empty())
{
int c=s1.top();
if(heights[c]>=heights[i])
{
s1.pop();
continue;
}
else break;
}
if(s1.empty())
{
v1[i]=-1;
s1.push(i);
}
else{
v1[i]=s1.top();s1.push(i);
}
}
stack<int> s2;
v2[heights.size()-1]=heights.size();
s2.push(heights.size()-1);
for(int i=heights.size()-2;i>=0;i--)
{
while(!s2.empty())
{
int c=s2.top();
if(heights[c]>=heights[i])
{
s2.pop();
continue;
}
else break;
}
if(s2.empty())
{
v2[i]=heights.size();
s2.push(i);
}
else{
v2[i]=s2.top();s2.push(i);
}
}
int maxx=-1;
for(int i=0;i<heights.size();i++)
{
maxx=max(maxx,heights[i]*(v2[i]-i+i-v1[i]-1));
}
return maxx;
}
};
写完代码,越发感觉到这个题的思路的nb。