「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
题目描述
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例1
输入: heights = [2,1,5,6,2,3]
输出: 10
解释: 最大的矩形为图中红色区域,面积为 10
思路分析
在结合上一道题单调栈——739每日温度的前提下,我们可以想象为这道题的目前是算出【某天后要经过几天才能遇到更低温度 * 该天温度】的最大值。听起来有点绕口,实际上能帮助我们看到两道题的共性,我们仍然可以仿照每日温度将【某天后要经过几天才能遇到更低温度 * 该天温度】的值存在一个数组中,并在最后获取最大值(当然我们也可以将其存在一个int max中,但这是灵活的事,而不是共性的事)。
目前的共性是,似乎单调栈与某idx距符合条件M的的最近距离。
具体实现
int largestRectangleArea(vector<int>& heights) {
stack<int> stk;
int maxRet = 0;
for (int i = 0; i < heights.size(); i ++){
while(!stk.empty() && heights[stk.top()] > heights[i]) {
int tmp = stk.top(); stk.pop();
maxRet = max((i - tmp) * heights[tmp], maxRet);
}
stk.push(i);
}
if(!stk.empty()){
int s = stk.top() + 1;
while(!stk.empty()){
int tmp = stk.top(); stk.pop();
maxRet = max((s - tmp) * heights[tmp], maxRet);
}
}
return maxRet;
}
总结
自信提交的第一次并没有判空的部分,第二次补上之后发现还是没有通过。
仔细检查后发现没有计算前面的部分,因此需要双向计算。获得左右两个边界,再计算矩形面积。而且由于使用的maxRet而不是数组,导致最后还需要处理一遍栈中的值。