给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。

leetcode| 84. 柱状图中最大的矩形 算法 第1张
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
leetcode| 84. 柱状图中最大的矩形 算法 第2张
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

示例:
输入: [2,1,5,6,2,3]
输出: 10

思路

分治法:maxArea = max(当前区间minHeight*区间长度, max(minIndex左侧区间子问题, minIndex右侧区间子问题))
时间复杂度O(nlgn),最坏O(n²),空间复杂度O(n)。

代码

class Solution {
    public int calcArea(int[] heights, int start, int end) {
        if(end < start) return 0;
        int minIndex = start;
        int minHeight = heights[start];
        for(int i = start+1; i <= end; i++) {
            if(heights[i] < minHeight) {
                minHeight = heights[i];
                minIndex = i;
            }
        }
        return Math.max(minHeight*(end-start+1), Math.max(calcArea(heights,start,minIndex-1),calcArea(heights,minIndex+1,end)));
    }
    
    public int largestRectangleArea(int[] heights) {
        return calcArea(heights, 0, heights.length-1);
    }
}

笔记

存在栈方法,时间复杂度O(n),空间复杂度O(n)。

链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄