代码随想录 | 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;}
};

相关内容

热门资讯

原创 中... 最近,美债这盘棋下得格外引人注目,中国接连抛售美债,美方的反应也非常迅速,甚至连特朗普都在“空军一号...
透视贵州双龙航空港经济区春节保... 每经记者|熊嘉楠 每经编辑|魏官红 春节前一个工作日的清晨,仓储经理吴庆超和往常一样早早来到了库房...
平均票价近六年最低,猫眼研究院... 2月24日,猫眼研究院发布《2026春节档数据洞察》(以下简称《洞察》)。《洞察》显示,今年春节档电...
星瞰IPO | 绿云软件“抢头... 《星岛》记者 曹安浔 广州报道 2月20日,香港交易所迎来丙午马年首个交易日,财政司司长陈茂波、港交...
原创 乌... 乌克兰如今正面临着空前的能源危机,特别是在与俄罗斯的能源对抗中,局势变得愈发复杂。近日,乌克兰中西部...
华为2025年成绩单曝光!销售... 马年开工首日,华为2025年成绩单曝光! 2月24日上午,华为技术有限公司董事长梁华在2026广东省...
医疗探视系统优选珠海名科电子科... 在医疗信息化快速发展的当下,医院对于重症监护室(ICU)的智能化管理需求日益增长。如何通过技术手段提...
李嘉诚,突发! 来源:中国基金报 【导读】A股开门红,巴拿马政府强行接管李嘉诚旗下港口 中国基金报记者 泰勒 大家好...
合煦智远基金董事长郑旭代任总经... 中国经济网北京2月24日讯 近日,合煦智远基金公告,董事长郑旭代任总经理,原总经理李骥继续任基金经理...
卫浴商家救命帖!小红书同城获客... 做卫浴同城生意的宝子们,是不是都被同一个问题搞疯?明明门店产品能打、价格能打,却只能守着门头等客来;...
企业数字化选型指南:先上ERP... 一、核心结论 在2025至2026年的行业背景下,关于先上ERP(企业资源计划)还是MES(制造执行...
涨停潮!两大板块,爆发! 两大板块爆发。 A股两大板块爆发 A股市场今天上午整体上行,主要指数不同程度上涨。截至上午收盘,上证...
汇正财经:避险升温,原油黄金价... 近期,全球资本市场经历了剧烈的波动。美国最高法院裁定特朗普政府关税政策违法,但特朗普随即宣布拟将全球...
新政后首家!西南证券60亿定增... 春节前夕,西南证券(600369)一纸不超过60亿元的定增预案,在券业再融资市场投下了一枚重磅棋子。...
四点半观市 | 沪深北三市超4... 沪指收涨0.87% 逾4000股飘红;标普油气ETF涨9.73% 影视ETF跌7.8%;工业属性与金...
节后首日,A股全线飘红,超40... 每经记者:杜波 记者|杜波 编辑|段炼 杜恒峰 校对|许绍航 2月24日,马年第一个交易日,A股全...
黄金周报|避险情绪提振,金价震... 截至本周一(2月23日),伦敦现货黄金报收5237.84美元/盎司,自2月6日以来累计上涨357.8...
原创 哪... 提及成功人士,许多人首先会想到那些在富豪榜上常年占据一席之地,身价过亿的男性人物,比如马云、王健林等...
白银LOF九成投资者全额获偿,... 春节前,国投瑞银基金发布《关于白银基金相关方案的公告》,针对旗下国投瑞银白银期货证券投资基金(LOF...