目录
84.柱状图中最大的矩形
前言
思路
算法实现
总结
84.柱状图中最大的矩形
题目链接
文章链接
前言
本题与上一题接雨水的题目有点类似,原理上有很多相同的地方,依然利用单调栈的方法进行求解。
思路
接雨水是是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。
本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序!只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。
所以本题单调栈的顺序正好与接雨水反过来。
其实就是栈顶和栈顶的下一个元素以及要入栈的三个元素组成了我们要求最大面积的高度和宽度。
算法实现
class Solution {
public:int largestRectangleArea(vector<int>& heights) {int result = 0;stack<int> st;heights.insert(heights.begin(), 0);heights.insert(heights.end(), 0);st.push(0);for (int i = 1; i < heights.size(); i++) {if (heights[i] > heights[st.top()]) {st.push(i);}else if (heights[i] == heights[st.top()]) {st.push(i);}else {while (!st.empty() && heights[i] < heights[st.top()]) {int mid = st.top();st.pop(); if (!st.empty()) {int h = heights[mid];int w = i - st.top() - 1;result = max(result, h * w);}}st.push(i);}}return result;}
};
总结
代码随想录一刷完成!