算法-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),最坏情况下需要存储所有元素的索引

你可能感兴趣的:(javascript,算法)