leetcode 84 直方图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

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

解法1:

遍历数组,每找到一个局部峰值,然后向前遍历所有的值,算出共同的矩形面积,每次对比保留最大值.

public int largestRectangleArea(int[] heights) {
    int res = 0;
    for(int i = 0; i < heights.length; i++){
        if(i + 1 < i && heights[i] <= heights[i + 1]){
            continue;
        }
        int minH = heights[i];
        for(int j = i; j >=0; j--){
            minH = Math.min(minH, heights[j]);
            int area = minH * (i - j + 1);
            res = Math.max(res, area);
        } 
    }
    return res;
}

解法2:单调栈

public int largestRectangleArea(int[] heights) {
    if(heights == null || heights.length == 0) return 0;
    int res = 0;
    Stack<Integer> s = new Stack<>();
    for(int i = 0; i < heights.length; i++){
        while(!s.isEmpty() && heights[i] <= heights[s.peek()]){
            int j = s.pop();
            int k = s.isEmpty() ? -1 : s.peek();
            int curArea = (i - k - 1) * heights[j];
            res = Math.max(res, curArea);
        }
        s.push(i);
    }
    while(!s.isEmpty()){
        int j = s.pop();
        int k = s.isEmpty() ? -1 : s.peek();
        int curArea = (heights.length - k - 1) * heights[j];
        res = Math.max(res, curArea);
    }
    return res;
}

猜你喜欢

转载自blog.csdn.net/qq_43322057/article/details/84654030
今日推荐