柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
输入: [2,1,5,6,2,3]
输出: 10
暴力法:
/**
* @param {number[]} heights
* @return {number}
*/
var largestRectangleArea = function (heights) {
if (!heights || !heights.length) return 0;
let maxArea = 0;
for (let i = 0; i < heights.length; i++) {
let minHeight = Infinity;
for (let j = i; j < heights.length; j++) {
minHeight = Math.min(minHeight, heights[j]);
maxArea = Math.max(maxArea, (j - i + 1) * minHeight);
}
}
return maxArea;
};
var largestRectangleArea = function (heights) {
if (!heights || !heights.length) return 0;
let maxArea = 0;
for (let i = 0; i < heights.length; i++) {
let left = i,
right = i;
while (left - 1 > -1 && heights[left - 1] >= heights[i]) {
--left;
}
while (right + 1 < heights.length && heights[right + 1] >= heights[i]) {
++right;
}
maxArea = Math.max(maxArea, heights[i] * (right - left + 1));
}
return maxArea;
};
栈
var largestRectangleArea = function (heights) {
let maxArea = 0;
let stack = [-1];
for (let i = 0; i < heights.length; i++) {
while (stack.length > 1 && heights[stack[stack.length - 1]] >= heights[i]) {
maxArea = Math.max(
maxArea,
heights[stack.pop()] * (i - stack[stack.length - 1] - 1)
);
}
stack.push(i);
}
while (stack.length > 1) {
maxArea = Math.max(
maxArea,
heights[stack.pop()] * (heights.length - stack[stack.length - 1] - 1)
);
}
return maxArea;
};
var largestRectangleArea = function (heights) {
heights.push(0);
const stack = [];
let maxArea = 0;
for (let i = 0; i < heights.length; i++) {
while (stack.length > 1 && heights[stack[stack.length - 1]] > heights[i]) {
maxArea = Math.max(heights[stack.pop()] * (i - 1 - stack[stack.length - 1]), maxArea);
}
if (stack.length && heights[stack[stack.length - 1]] > heights[i]) {
maxArea = Math.max(heights[stack.pop()] * i, maxArea);
}
stack.push(i);
}
return maxArea;
};
/**
* @param {number[]} heights
* @return {number}
*/
const largestRectangleArea = function (heights) {
let maxArea = 0;
const stack = [];
heights = [0].concat(heights).concat([0]);
for (let i = 0; i < heights.length; i++) {
while (stack && heights[stack[stack.length - 1]] > heights[i]) {
const j = stack.pop();
maxArea = Math.max((i - stack[stack.length - 1] - 1) * heights[j], maxArea);
}
stack.push(i);
}
return maxArea;
};