今天是整个代码随想录刷题中的最后一道题目,马上就结束了,开冲,明天写感想!!!
今日任务:
- 84.柱状图中最大的矩形
文章目录
题目一:84.柱状图中的最大矩形
Leetcode题目:【84.柱状图中的最大矩形】
这道题目与接雨水的题目是遥想呼应的,这个其实就是找当前元素的第一个比其小的元素。
整体思路:以每一个元素为基准,然后找左边比它矮的和右边比他矮的,相减可以得到宽,然后乘以本元素的数值即为高,然后就是以它为基准所能包含的最大矩形的面积,然后取最大即可。
与之前不同的是找最小,并且在首和尾都加一个0
为什么在尾部加一个0:
如果数组为:[2, 4, 6, 8],那么数据全部入栈之后,不会走到计算过程那里。
为什么在头部加一个0?
对于数组[8, 6, 2, 4],因为计算面积,需要三个参数,mid,left和right,但是永远凑不齐:
更细节的东西,请参考:【代码随想录值柱状图中最大的矩形】
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> st;
int result = 0;
vector<int> new_heights(heights.size()+2, 0);
for(int i = 1; i<=heights.size(); i++){
new_heights[i] = heights[i-1];
}
st.push(0);
for(int i = 1; i<new_heights.size(); i++){
if(new_heights[i] >= new_heights[st.top()]){
st.push(i);
}else{
while(!st.empty() && new_heights[i] < new_heights[st.top()]){
int mid = st.top();
st.pop();
if(!st.empty()){
int h = new_heights[mid];
int w = i - st.top() - 1;
if(result < h * w) result = h * w;
}
}
st.push(i);
}
}
return result;
}
};