小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
一、了解题目
附上原题链接:84. 柱状图中最大的矩形
给定 n
个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1
。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例 1:
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
二、题解分析
这道题用栈的方式来解答。那么接下来我们来看下这道题的解题步骤,具体如下:
- 定义一个栈,用来存放比前面大的数据。
- 遍历
height
,遇到数据比前面的大时,则进行入栈操作; - 否则,则进行面积计算。
三、代码实现
依据上面的题解,我们将用 js
来实现这道题。具体实现代码如下:
/**
* @param {number[]} heights
* @return {number}
*/
const largestRectangleArea = (heights) => {
// 1.定义一个变量,存放最大面积
let maxArea = 0;
// 2.定义一个栈,用来存放比前面大的数据
const stack = [];
// 3.前后再加上一个0,为了让后面的矩形框能够名正言顺的入栈
heights = [0, ...heights, 0];
// 4.遍历数组
for (let i = 0; i < heights.length; i++) {
// 4.2 遇到比前面数小的再做比较,比前面高的不比较,没有比较的可比性
// 为什么呢?因为还在赛跑,也不知道后面还有没有更高的
while (heights[i] < heights[stack[stack.length - 1]]) {
// 4.2.1 把栈比作一个浴缸,栈顶元素出栈,并保存栈顶元素的索引
const stackTopIndex = stack.pop();
// 计算出栈的bar形成的长方形面积,并与之前的最大面积进行比较
maxArea = Math.max(
maxArea,
heights[stackTopIndex] * (i - stack[stack.length - 1] - 1) // i - stack[stack.length - 1]即当前索引减去栈中最后一个元素的值再减1
)
}
// 4.1 遇到数比前面大的,进行入栈操作
stack.push(i);
}
// 5.返回结果
return maxArea;
}
console.log(largestRectangleArea([2, 1, 5, 6, 2, 3])); // 10
四、过程回顾
最后我们用一张图来描述整道题所经历的所有过程。具体如下图👇
以上就是关于的题解,不知道对小伙伴们是否有帮助呢?
我们下期见👋👋👋