[每日一题][找工作第75天][2025-12-06] Leetcode 84. 柱状图中最大的矩形

题目

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

我的代码(Python)

/**
 * @param {number[]} heights
 * @return {number}
 */
var largestRectangleArea = function(heights) {
    if (heights.length === 0) {
        return 0;
    }
    let calResult = new Array(heights.length).fill(0);
    let calStack = [];
    // right
    for (let i = 0; i < heights.length; i++) {
        calResult[i] = heights[i];
        while (calStack.length > 0 && heights[calStack[calStack.length - 1]] > heights[i]) {
            calResult[calStack[calStack.length - 1]] += heights[calStack[calStack.length - 1]] * (i - calStack[calStack.length - 1] - 1);
            calStack.pop();
        }
        if (heights[i] > 0) {
            calStack.push(i);
        }
    }
    for (let idx of calStack) {
        calResult[idx] += heights[idx] * (heights.length - 1 - idx);
    }
    calStack = [];
    // left
    for (let i = heights.length - 1; i >= 0 ; i--) {
        while (calStack.length > 0 && heights[calStack[calStack.length - 1]] > heights[i]) {
            calResult[calStack[calStack.length - 1]] += heights[calStack[calStack.length - 1]] * (calStack[calStack.length - 1] - i - 1);
            calStack.pop();
        }
        if (heights[i] > 0) {
            calStack.push(i);
        }
    }
    for (let idx of calStack) {
        calResult[idx] += heights[idx] * idx;
    }
    let result = 0;
    for (let i = 0; i < calResult.length; i++) {
        result = Math.max(result, calResult[i]);
    }
    return result;
};

点评

要找的是每一个数,对应的左右两边比它小的最近一个索引。这样就可以计算面积了。
用栈的思想分别找左右边界。
参考739. 每日温度
我的解法
官方的基本解法就是这样。不过在弹出时,就可以确定另一侧的边界,所以只遍历一次就可以了,这个是我没想到的,差一些的原因应该就是这个。


baddif@gmail.com

AI简历优化站

Nonpareil.me:优化简历,助力职场
开源代码

AI求职跟踪器(建设中)

开源代码

主站(建设中)

Nonpareil Me

相关平台

Github Issues / Notion / Blog

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部