算法-js-柱状图中最大的矩形
题:给定非负整数数组 heights ,数组中的数字用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。
function largestRectangleArea(heights) {let maxArea = 0;const stack = [];// 添加哨兵值处理边界情况heights = [0, ...heights, 0];for (let i = 0; i < heights.length; i++) {// 当当前高度小于栈顶高度时,计算面积while (stack.length && heights[i] < heights[stack[stack.length - 1]]) {const cur = stack.pop();const left = stack[stack.length - 1];const width = i - left - 1;maxArea = Math.max(maxArea, width * heights[cur]);}stack.push(i);}return maxArea;
}// 示例测试
console.log(largestRectangleArea([2,1,5,6,2,3])); // 输出 10
console.log(largestRectangleArea([2,4])); // 输出 4
算法原理说明:
单调递增栈:维护一个存储柱状图索引的栈,保证栈中索引对应的柱子高度单调递增
关键操作:
当遇到较小高度时,弹出栈顶元素作为当前高度
计算宽度:当前索引 - 新栈顶索引 - 1
面积计算:高度 * 宽度
哨兵技巧:
在数组首尾添加0作为边界哨兵
避免处理空栈的特殊情况
确保所有柱子都会被计算
复杂度分析:
时间复杂度:O(n),每个元素最多入栈和出栈一次
空间复杂度:O(n),最坏情况下需要存储所有元素的索引