仲灏小栈 仲灏小栈
首页
大前端
后端&运维
其他技术
生活
关于我
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

仲灏

诚意, 正心, 格物, 致知
首页
大前端
后端&运维
其他技术
生活
关于我
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 嵌入式

  • Android

  • 编辑器

  • 产品&设计

  • 测试

  • 虚拟机

  • 算法

    • 最长公共前缀
    • 盛最多水的容器
    • 三数之和
    • 最长公共前缀
    • 合并两个有序链表
    • 接雨水
    • 字母异位词分组
    • 爬楼梯
    • 柱状图中最大的矩形
      • 题目
      • 题解
    • 滑动窗口最大值
    • 有效的字母异位词
    • 移动零
    • 宝石与石头
    • IP 地址无效化
    • 分割平衡字符串
    • 拥有最多糖果的孩子
    • 重新排列数组
    • 数组异或操作
    • 好数对的数目
    • 设计停车系统
    • 最富有客户的资产总量
    • 比赛中的配对次数
    • 解码异或后的数组
    • 查找每个员工花费的总时间
    • 差的绝对值为-k-的数对数目
    • 执行操作后的变量值
    • 句子中的最多单词数
    • 拆分数位后四位数字的最小和
    • excel-表中某个范围内的单元格
    • 第一个出现两次的字母
    • 算术三元组的数目
    • 矩阵中的局部最大值
  • 网络

  • 安全

  • Nas

  • 硬件

  • CDCI

  • 破解

  • 建筑

  • clash-rule最佳配置
  • Untitled
  • 其他技术
  • 算法
仲灏
2024-01-28
目录

柱状图中最大的矩形

# 题目

84. 柱状图中最大的矩形 (opens new window)

困难

相关标签

相关企业

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

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

示例 1:

img

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
1
2
3

示例 2:

img

输入: heights = [2,4]
输出: 4
1
2

提示:

  • 1 <= heights.length <=105
  • 0 <= heights[i] <= 104

# 题解

/**
 * 暴力1
 * @param {number[]} heights
 * @return {number}
 */
var largestRectangleArea = function (heights) {
    let maxArea = 0;
    for (let i = 0; i < heights.length - 1; i++) {
        for (let j = i + 1; j < heights.length; j++) {
            const minHeight = Math.min(...heights.slice(i, j+1))
            maxArea = Math.max(maxArea, (j - i + 1) * minHeight)
        }
    }
    return maxArea
};
/**
 * 暴力2  找边界
 * @param {number[]} heights
 * @return {number}
 */
var largestRectangleArea = function (heights) {
    let maxArea = 0;
    for (let i = 0; i < heights.length - 1; i++) {
        const curHeight = heights[i]
        let leftBound = i;
        let rightBound = i;
        while(leftBound-1 >= 0 && heights[leftBound-1] >= curHeight ) {
            leftBound --
        }
        while(rightBound+1 <= heights.length && heights[rightBound+1] >= curHeight ) {
            rightBound ++
        }
        maxArea = Math.max(maxArea, (rightBound - leftBound + 1) * curHeight)
    }
    return maxArea
};
/**
 * 栈方法
 * @param {number[]} heights
 * @return {number}
 */
var largestRectangleArea = function (heights) {
    let maxArea = 0;
    const stackArr = [];
    heights = [0, ...heights, 0]
    for (let i = 0; i < heights.length; i++) {
        while (stackArr.length && heights[stackArr[stackArr.length - 1]] > heights[i]) {
            const stackPopIndex = stackArr.pop() // 栈顶元素出栈,并保存栈顶bar的索引
            maxArea = Math.max(maxArea, heights[stackPopIndex] * (i - stackArr[stackArr.length - 1] - 1))
        }
        stackArr.push(i)
    }
    return maxArea
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
上次更新: 2024/01/28, 17:03:40
爬楼梯
滑动窗口最大值

← 爬楼梯 滑动窗口最大值→

最近更新
01
vim日常使用记录
04-02
02
滑动窗口最大值
04-02
03
有效的字母异位词
04-02
更多文章>
Theme by Vdoing | Copyright © 2021-2025 izhaong | github | 蜀ICP备2021031194号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式