给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
示例:
输入: [2,1,5,6,2,3]
输出: 10
当时想着就这?还困难?随便就想出来了
结果很不幸没有通过全部测试案例
因为超时了
然后一看案例,魔鬼啊
先粘贴一下小白的代码,毕竟用了双重循环,其实就是枚举高和宽,还搞得像dp:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
//根据以往经验,如果是判断以每个矩形为右边然后和左边组成的最大矩形面积呢
int dp[heights.size()];
dp[0]=heights[0];
int result=dp[0];
for(int i=1;i<heights.size();i++){
int maxarea=0;
int minheight=heights[i];
dp[i]=heights[i];
for(int j=i-1;j>=0;j--){
minheight=min(minheight,heights[j]);
int area=minheight*(i-j+1);
dp[i]=max(dp[i],area);
}
result=max(result,dp[i]);
}
return result;
}
};
然后看了教程
原来是用单调栈。。。
好好学习一下,虽然理解没那么透彻……
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
// 初始化最终结果为0
int res = 0;
stack<int>st;
// 将给定的原数组左右各添加一个元素0
int newHeights[heights.size()+2];
newHeights[0] = 0;
newHeights[heights.size()+1] = 0;
for (int i = 1; i < heights.size()+ 1; i++) {
newHeights[i] = heights[i - 1];
}
// 开始遍历
for (int i = 0;i<heights.size()+2; i++) {
// 如果栈不为空且当前考察的元素值小于栈顶元素值,
// 则表示以栈顶元素值为高的矩形面积可以确定
while (!st.empty() && newHeights[i] < newHeights[st.top()]) {
// 弹出栈顶元素
int cur=st.top();
st.pop();
// 获取栈顶元素对应的高
int curHeight = newHeights[cur];
// 栈顶元素弹出后,新的栈顶元素就是其左侧边界
int leftIndex = st.top();
// 右侧边界是当前考察的索引
int rightIndex = i;
// 计算矩形宽度
int curWidth = rightIndex - leftIndex - 1;
// 计算面积
//cout<<curWidth<<" "<<curHeight<<endl;
res =max(res, curWidth * curHeight);
}
// 当前考察索引入栈
st.push(i);
}
return res;
}
};