当前位置: 面试刷题>> 直方图中最大矩形面积 (经典算法题500道)


题目描述补充

给定一个非负整数数组 heights,代表直方图中每个条形的宽度为 1 的情况下的高度。你需要在直方图中找到能形成的矩形的最大面积。矩形的边必须平行于坐标轴,且每条边必须与直方图中的一个或多个条形接触。

示例

输入: heights = [2,1,5,6,2,3]

输出: 10

解释: 在这个例子中,最大的矩形面积是在高度为 5 的条形上,宽度为 2(即条形 2 和 3)。

PHP 示例代码

function largestRectangleArea($heights) {
    $stack = [];
    $maxArea = 0;
    $heights[] = 0; // 添加一个哨兵,方便处理边界
    $n = count($heights);

    for ($i = 0; $i < $n; $i++) {
        while (!empty($stack) && $heights[$stack[count($stack) - 1]] >= $heights[$i]) {
            $h = $heights[array_pop($stack)];
            $w = empty($stack) ? $i : $i - $stack[count($stack) - 1] - 1;
            $maxArea = max($maxArea, $h * $w);
        }
        $stack[] = $i;
    }

    return $maxArea;
}

// 示例用法
$heights = [2, 1, 5, 6, 2, 3];
echo largestRectangleArea($heights); // 输出 10

Python 示例代码

def largestRectangleArea(heights):
    stack = []
    max_area = 0
    heights.append(0)  # 哨兵
    
    for i, h in enumerate(heights):
        while stack and heights[stack[-1]] >= h:
            height = heights[stack.pop()]
            width = i if not stack else i - stack[-1] - 1
            max_area = max(max_area, height * width)
        stack.append(i)
    
    return max_area

# 示例用法
heights = [2, 1, 5, 6, 2, 3]
print(largestRectangleArea(heights))  # 输出 10

JavaScript 示例代码

function largestRectangleArea(heights) {
    let stack = [];
    let maxArea = 0;
    heights.push(0); // 哨兵

    for (let i = 0; i < heights.length; i++) {
        while (stack.length > 0 && heights[stack[stack.length - 1]] >= heights[i]) {
            let h = heights[stack.pop()];
            let w = stack.length === 0 ? i : i - stack[stack.length - 1] - 1;
            maxArea = Math.max(maxArea, h * w);
        }
        stack.push(i);
    }

    return maxArea;
}

// 示例用法
let heights = [2, 1, 5, 6, 2, 3];
console.log(largestRectangleArea(heights)); // 输出 10

码小课

码小课网站中有更多关于算法和数据结构的学习内容,包括各类经典算法问题的详细解析和代码实现,帮助大家更好地理解和掌握算法知识。欢迎大家访问码小课网站,一起学习和进步!

推荐面试题