代码随想录算法训练营day60 | 单调栈 84.柱状图中最大的矩形
创始人
2025-05-28 19:12:20

84.柱状图中最大的矩形

题目链接
解题思路:
本地单调栈的解法和接雨水的题目是遥相呼应的。

42. 接雨水是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。

这里就涉及到了单调栈很重要的性质,就是单调栈里的顺序,是从小到大还是从大到小。

在题解42. 接雨水 中接雨水的单调栈从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。

那么因为本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序!

我来举一个例子,如图:
在这里插入图片描述
只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。

所以本题单调栈的顺序正好与接雨水反过来。

此时大家应该可以发现其实就是栈顶和栈顶的下一个元素以及要入栈的三个元素组成了我们要求最大面积的高度和宽度

理解这一点,对单调栈就掌握的比较到位了。

除了栈内元素顺序和接雨水不同,剩下的逻辑就都差不多了。

主要就是分析清楚如下三种情况:

  • 情况一:当前遍历的元素heights[i]大于栈顶元素heights[st.top()]的情况
  • 情况二:当前遍历的元素heights[i]等于栈顶元素heights[st.top()]的情况
  • 情况三:当前遍历的元素heights[i]小于栈顶元素heights[st.top()]的情况

C++代码如下:

class Solution {
public:int largestRectangleArea(vector& heights) {int result = 0;stack st;heights.insert(heights.begin(), 0); // 数组头部加入元素0heights.push_back(0); // 数组尾部加入元素0st.push(0);// 第一个元素已经入栈,从下标1开始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.pop(); // 这个可以加,可以不加,效果一样,思路不同st.push(i);} else { // 情况三while (!st.empty() && heights[i] < heights[st.top()]) { // 注意是whileint mid = st.top();st.pop();if (!st.empty()) {int left = st.top();int right = i;int w = right - left - 1;int h = heights[mid];result = max(result, w * h);}}st.push(i);}}return result;}
};

相关内容

热门资讯

英语句子个人主页【最新6篇】 英语句子个人主页 篇一初识英语句子作为英语学习的基础,英语句子是我们在学习过程中不可或缺的一部分。无...
网购的好处英语作文【精选6篇... 网购的好处英语作文 篇一The Benefits of Online ShoppingIn toda...
七年级下册2013外研社英语... 七年级下册2013外研社英语所有句子 篇一第一篇内容本文将按照七年级下册2013外研社英语教材的顺序...
小王子英语读后感100字【推... 小王子英语读后感100字 篇一After reading "The Little Prince" i...
中国英语作文【推荐5篇】 中国英语作文 篇一:中国传统文化的魅力中国是一个拥有悠久历史和丰富文化的国家。中国的传统文化深深影响...