leetcode 84 柱状图中最大的矩形

84. 柱状图中最大的矩形

难度困难551

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

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

img

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

img

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

示例:

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

思路

使用 栈。
样例参考下图。

在这里插入图片描述
在这里插入图片描述

代码

import java.util.*;
class Solution {
    public int largestRectangleArea(int[] heights) {
        // 使用栈
        return largestRectangleArea1(heights);
    }

    public int largestRectangleArea1(int[] heights) {
        // 使用栈 保存下标
        Stack<Integer> stack = new Stack<>();
        stack.push(-1);  // 以-1为底判断
        int maxArea = 0; // 当前最大面积
        for (int i = 0; i < heights.length ; i++) {
            // 判断栈底部数据是否已经全部出栈
            // 下一个数的到来的数据 是否形成 降序 如果是的话就行处理 否则直接入栈
            while (stack.peek()!=-1 && heights[stack.peek()] >= heights[i])
                // 形成降序的话 就出栈 进行计算 当前元素与栈中满足出栈条件的元素 索性成的面积大小,不断更新 maxArea
                maxArea = Math.max(maxArea, heights[stack.pop()] * (i - stack.peek() - 1));
       		// 如果能够继续形成 升序 则直接将当前元素放入 栈 中
            stack.push(i);
        }
        // 遍历完数组后,处理栈不空的情况 从后往前处理
        while (stack.peek() != -1){
            // 再次出栈 计算栈顶元素 与栈中剩下的元素所形成的最大面积
            maxArea = Math.max(maxArea, heights[stack.pop()] * (heights.length - stack.peek() - 1));
        }
        return maxArea;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值