📜  使用 JavaScript 的直方图下的最大矩形区域 |不使用堆栈(1)

📅  最后修改于: 2023-12-03 15:22:12.866000             🧑  作者: Mango

使用 JavaScript 的直方图下的最大矩形区域 | 不使用堆栈

在计算机科学中,直方图是一个统计图,用等宽的矩形表示数据分布情况。直方图下的最大矩形区域表示直方图中最大的由矩形围成的面积。本篇文章将介绍如何在 JavaScript 中实现直方图下的最大矩形区域的计算,同时不使用堆栈进行实现。

问题描述

给定一个直方图,其中每个矩形的宽度为1,高度为数组中的元素。计算直方图下的最大矩形区域。

例如,给定直方图[2,1,5,6,2,3],所示的直方图中最大的矩形区域为10,由高度为5和6的矩形围成。

解题思路

要计算直方图下的最大矩形区域,需要解决两个关键问题:

  1. 如何确定每个矩形的左右边界;
  2. 如何计算每个矩形的面积。

对于第一个问题,可以使用两个数组 left 和 right 来确定每个矩形的左右边界。其中,left[i] 表示矩形 i 左边第一个小于其高度的矩形的下标,right[i] 表示矩形 i 右边第一个小于其高度的矩形的下标。如果没有则对应值为 -1。

对于第二个问题,要计算每个矩形的面积,可以使用矩形的高度与其左右边界计算得到。

由于本篇文章不使用堆栈的方法来解决此问题,因此需要使用两个指针 l 和 r 分别从左到右和从右到左来确定每个矩形的左右边界。具体做法如下:

  1. 初始化数组 left 和 right 的所有元素为 -1 和直方图长度,表示没有左右边界;
  2. 从左到右遍历直方图,对于每个矩形,如果其高度小于等于直方图中上一个矩形的高度,则更新其左边界为上一个矩形的下标;
  3. 从右到左遍历直方图,对于每个矩形,如果其高度小于等于直方图中上一个矩形的高度,则更新其右边界为上一个矩形的下标;
  4. 对于每个矩形,计算其面积,并记录最大值。
代码实现

以下是 JavaScript 实现直方图下的最大矩形区域的代码实现。

/**
 * 计算直方图下的最大矩形面积
 * @param {number[]} heights 直方图各个矩形的高度
 * @return {number} 最大矩形面积
 */
function largestRectangleArea(heights) {
    let len = heights.length;
    let left = new Array(len).fill(-1);
    let right = new Array(len).fill(len);

    let l = -1;
    for (let i = 0; i < len; i++) {
        while (l >= 0 && heights[i] <= heights[l]) {
            left[i] = left[l];
            l--;
        }
        left[i] = l;
        l = i;
    }

    let r = len;
    for (let i = len - 1; i >= 0; i--) {
        while (r < len && heights[i] <= heights[r]) {
            right[i] = right[r];
            r++;
        }
        right[i] = r;
        r = i;
    }

    let maxArea = 0;
    for (let i = 0; i < len; i++) {
        let area = (right[i] - left[i] - 1) * heights[i];
        maxArea = Math.max(area, maxArea);
    }

    return maxArea;
}
总结

本篇文章介绍了如何使用 JavaScript 实现直方图下的最大矩形区域计算,同时不使用堆栈进行实现。在解题时,需要注意确定每个矩形的左右边界和计算每个矩形的面积。