📅  最后修改于: 2023-12-03 15:22:12.866000             🧑  作者: Mango
在计算机科学中,直方图是一个统计图,用等宽的矩形表示数据分布情况。直方图下的最大矩形区域表示直方图中最大的由矩形围成的面积。本篇文章将介绍如何在 JavaScript 中实现直方图下的最大矩形区域的计算,同时不使用堆栈进行实现。
给定一个直方图,其中每个矩形的宽度为1,高度为数组中的元素。计算直方图下的最大矩形区域。
例如,给定直方图[2,1,5,6,2,3],所示的直方图中最大的矩形区域为10,由高度为5和6的矩形围成。
要计算直方图下的最大矩形区域,需要解决两个关键问题:
对于第一个问题,可以使用两个数组 left 和 right 来确定每个矩形的左右边界。其中,left[i] 表示矩形 i 左边第一个小于其高度的矩形的下标,right[i] 表示矩形 i 右边第一个小于其高度的矩形的下标。如果没有则对应值为 -1。
对于第二个问题,要计算每个矩形的面积,可以使用矩形的高度与其左右边界计算得到。
由于本篇文章不使用堆栈的方法来解决此问题,因此需要使用两个指针 l 和 r 分别从左到右和从右到左来确定每个矩形的左右边界。具体做法如下:
以下是 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 实现直方图下的最大矩形区域计算,同时不使用堆栈进行实现。在解题时,需要注意确定每个矩形的左右边界和计算每个矩形的面积。