代码随想录 | Day 60(完结) - LeetCode 84. 柱状图中最大的矩形
admin
2024-04-10 06:26:02
0

        今天是单调栈的最后一天,延续了昨天的接雨水问题。只有一道题,同样3种解法。其中DP和单调栈解法难度都有提升,都需要对两端元素做特殊处理。重点是以前面的接雨水问题为模板,理解下这类问题的“左、中、右柱子确定矩形”的方法。另外今天也是最后一天了,紧紧张张也算赶上了,这60天虽然不容易,但也一转眼就过去了,完结撒花~


        第1题(LeetCode 84. 柱状图中最大的矩形)与day 59中第2题(LeetCode 42. 接雨水)很相似,同样有双指针、DP、单调栈这3种解法。

        双指针法相比接雨水,主要是从“找左、右两边各自最高的柱子”变成了“要找左、右两边各自第一个比当前柱子小的位置”,使其分别作为左、右边界(不包含在内),再令当前柱子的高作为矩形的高,两者相乘得到当前位置的矩形大小。所以在内部循环找“第一个比当前柱子小的位置”时,要先将柱子大小初始化为当前柱子高度,然后向左/右移动直至遇到更小值为止。当然,同样因为时间复杂度时O(n²),所以会超时。

// 双指针
class Solution {
public:int largestRectangleArea(vector& heights) {int ans = 0;for (int i = 0; i < heights.size(); ++i) {int indLeft = i, indRight = i;while (indLeft >= 0 && heights[indLeft] >= heights[i]) {--indLeft;}while (indRight < heights.size() && heights[indRight] >= heights[i]) {++indRight;}int w = indRight - indLeft - 1, h = heights[i];ans = max(ans, w * h);}return ans;}
};

        DP解法也与接雨水类似。由于最后矩形的宽是两下标之差再减1,所以这一题的难度主要增加在“dp数组要记录下标而不是柱子高度”。具体来说,两个p数组,indSmallerLeft[i],indSmallerRight[i]分别代表位置i左、右两边第一个小于i位置柱子高度的柱子下标。所以对于位置i,其indSmallerLeft值就需要从(i - 1)开始不断通过indSmallerLeft表向左跳转,直到找到更小值(到0为止),其indSmallerRight值就需要从(i + 1)开始不断通过indSmallerRight表向右跳转,直到找到更小值(到heights表末尾为止)。

        初始化方面,indSmallerLeft和indSmallerRight需要分别初始化第0位和末尾位。第0位的左边界(不包含在内)应该是-1,末尾位的右边界(不包含在内)应该是“末尾 + 1”,所以indSmallerLeft[0]和indSmallerRight[height.size() - 1]分别初始化为-1和height.size()。indSmallerLeft和indSmallerRight在内层循环中需要使用while()。

// DP
class Solution {
public:int largestRectangleArea(vector& heights) {vector indSmallerLeft(heights.size()), indSmallerRight(heights.size());indSmallerLeft[0] = -1;for (int i = 1; i < heights.size(); ++i) {int j = i - 1;while (j >= 0 && heights[j] >= heights[i]) {j = indSmallerLeft[j];}indSmallerLeft[i] = j;}indSmallerRight[heights.size() - 1] = heights.size();for (int i = heights.size() - 2; i >= 0; --i) {int j = i + 1;while (j < heights.size() && heights[j] >= heights[i]) {j = indSmallerRight[j];}indSmallerRight[i] = j;}int ans = 0;for (int i = 0; i < heights.size(); ++i) {int w = indSmallerRight[i]- indSmallerLeft[i] - 1, h = heights[i];ans = max(ans, w * h);}return ans;}
};

        单调栈解法相比接雨水有3点不同:

  1. 栈从单调递减改为单调递增;
  2. 矩形的高度需要更改为中间柱子的高度;
  3. 接雨水问题中,左右两个端点的柱子永远不会有雨水,所以不会成为中间柱子。但这一题的左、右端点也可能成为中间柱子。然而此时左、右柱子右不存在。为此,要在heights前、后分别插入高度为0的柱子;
// 单调栈
class Solution {
public:int largestRectangleArea(vector& heights) {heights.insert(heights.begin(), 0); // 数组头部加入元素0heights.push_back(0); // 数组尾部加入元素0int ans = 0;stack st;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.pop();st.push(i);}else {while (!st.empty() && heights[i] < heights[st.top()]) {int mid = st.top();st.pop();if (!st.empty()) {int w = i - st.top() - 1;int h = heights[mid];ans = max(ans, w * h);}}st.push(i);}}return ans;}
};

相关内容

热门资讯

茅台宣布:涨价! 贵州茅台再次宣布提价。 公告称,此次价格调整将会对本公司经营业绩产生一定影响,敬请投资者理性投资,...
“一字之差”炒错股?上市药企半... 7月17日,深交所披露深市监管动态。 2026年7月13日至7月17日,深交所共对173起证券异常交...
人民币融资占比超八成!2026... 7 月 16 日,2026 中国(深圳)独角兽企业大会于南山区举行,两份重磅产业报告同步亮相,除披露...
抢滩17万亿市场!主动ETF要... 7月17日,证监会官网最新披露显示,首批18家主动ETF审批状态已显示为接收材料,首批产品名称也随之...
上市公司套保潮:1546家A股... 新华社北京7月18日电 《中国证券报》18日刊发文章《上市公司套保潮:1546家A股公司为何集体“上...
DeepSeek完成首轮融资 ... DeepSeek完成首轮融资,多家A股公司间接参股。 7月17日,在大盘大幅弱势走低背景下,三只公告...
原创 7... 美国财政部近期公布了各国持有美债的最新数据,其中中国大陆持仓的细微变化再次激起了资本市场的广泛关注和...
美股齐跌,费城半导体指数又跳水... 【导读】美股三大指数集体收跌,费城半导体指数再度下挫;美军称对伊朗发动新一轮打击,霍尔木兹海峡已“完...
原创 7... 津巴布韦政府放出狠话,明年1月1日起全面禁止锂精矿出口。这个非洲最大锂生产国的矿业部长波利特·坎巴穆...
卖一头亏一头!四大上市猪企半年... 本报(chinatimes.net.cn)记者徐芸茜 北京摄影报道 2026年上半年,受生猪价格持续...
原创 换... 第一次换房时,我把时间全花在户型、朝向、学位、总价上,连入户门朝哪边开都研究过,偏偏把楼层看轻了。那...
华为云联合头部金融机构和行业伙... [中国,上海,2026年7月18日] 2026世界人工智能大会(WAIC)期间,华为云举办以“汇聚行...
国家队出手!四日净流入290亿... 7月18日,高盛的“国家队”ETF资金流动追踪指标显示,7月13日~16日期间净流入达290亿元人民...
海底捞正在失去“标准答案” 前不久,海底捞旗下副牌“焰请烤肉铺子”多地闭店。 由于烤肉赛道足够大众化,主打“海底捞式烤肉体验”也...
中国航司半年订购476架空客飞... 7月17日晚间,中国国航(601111.SH)和海航控股(600221.SH)相继发布公告,分别与空...
原创 扎... 7月17日,俄罗斯外交部官方发言人玛丽亚·扎哈罗娃在俄罗斯电视节目中表示,欧洲国家首先应该关注为格陵...
i茅台深夜突放“涨价令”,涨幅... 7月17日晚,茅台官方放出调价消息! 依据《2026年贵州茅台酒市场化运营方案》,遵循“随行就市、供...
枣庄产业基金首期2亿募集完成,... 7月18日,山东丰元化学股份有限公司公告披露,参与投资设立产业基金募集完毕暨对外投资的进展。 山东丰...