题目链接:84. 柱状图中最大的矩形
题目描述
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例 1:
输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10
示例 2:
输入: heights = [2,4] 输出: 4
提示:
1 <= heights.length <=105
0 <= heights[i] <= 104
文章讲解:代码随想录
视频讲解:单调栈,又一次经典来袭! LeetCode:84.柱状图中最大的矩形_哔哩哔哩_bilibili
题解1:单调栈
思路:以数组中其中一个元素为基准画矩形,矩形的底为其左右第一个比他矮的柱子之间的部分,高为其高度。遍历数组并构建单调栈,得出答案。
/**
* @param {number[]} heights
* @return {number}
*/
var largestRectangleArea = function(heights) {
let res = 0;
const stack = [];
heights.push(0); // 尾部加0
for (let i = 0; i < heights.length; i++) {
while (stack.length > 0 && heights[stack[stack.length - 1]] > heights[i]) {
const mid = stack.pop();
const w = i - (stack.length > 0 ? stack[stack.length - 1] : -1) - 1;
const h = heights[mid];
res = Math.max(res, w * h);
}
if (stack.length > 0 && heights[stack[stack.length - 1]] === heights[i]) {
stack.pop();
}
stack.push(i);
}
return res;
};
分析:时间复杂度为 O(n),空间复杂度为 O(n)。
收获
练习单调栈解又一道单调栈的经典题目,使用单调栈可以找出数组元素左右第一个比它小或比它大的值。
代码随想录一刷完成打卡!