「栈」leetcode 84. 柱状图中最大的矩形(困难)

176 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、了解题目

附上原题链接:84. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:

img

输入: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

四、过程回顾

最后我们用一张图来描述整道题所经历的所有过程。具体如下图👇

IMG_1487.PNG


以上就是关于的题解,不知道对小伙伴们是否有帮助呢?

我们下期见👋👋👋