leetcode 84. 柱状图中最大的矩形【单调栈】

  1. 暴力法
    数组类题型肯定首先想到用暴力法解,求出所有可能得矩形面积并从中取最大值。
    但其实不难发现我们并不需要真的求出所有矩形面积,只需要求出在某一柱体的高度下,矩形所能达到的最大宽度,这样就能求出该柱体所对应的最大矩形面积,这样求出所有柱体的最大矩形面积即可得到答案。
class Solution {
    public int largestRectangleArea(int[] heights) {
        int area = 0, n = heights.length;
        // 遍历每个柱子,以当前柱子的高度作为矩形的高 h,
        // 从当前柱子向左右遍历,找到矩形的宽度 w。
        for (int i = 0; i < n; i++) {
            int w = 1, h = heights[i], j = i;
            while (--j >= 0 && heights[j] >= h) {
                w++;
            }
            j = i;
            while (++j < n && heights[j] >= h) {
                w++;
            }
            area = Math.max(area, w * h);
        }

        return area;
    }
}
  1. 单调栈
    遍历每个柱体,若当前的柱体高度大于等于栈顶柱体的高度,就直接将当前柱体入栈,否则若当前的柱体高度小于栈顶柱体的高度,说明当前栈顶柱体找到了右边的第一个小于自身的柱体,那么就可以将栈顶柱体出栈来计算以其为高的矩形的面积了。
class Solution {
    public int largestRectangleArea(int[] heights) {
        int len = heights.length;
        int[] arr = new int[len+2];
        //添加两个哨兵
        System.arraycopy(heights, 0, arr, 1, len);
        
        Deque<Integer> stack = new ArrayDeque<>();
        int res=0;
        for(int i=0; i<arr.length; i++){
            while(!stack.isEmpty() && arr[i] < arr[stack.peek()]){
                int h = arr[stack.pop()];
                res = Math.max(res, h * (i-stack.peek()-1));
            }
            stack.push(i);
        }
        return res;
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值