第 84 题. 柱状图中最大的矩形

参考题解:单调栈入门,使用单调栈快速寻找边界

这道题可以分为两种思路:

  1. 限定高度。
  2. 限定宽度。

其中,限定宽度的复杂度是 O(n^2),限定高度复杂度是 O(n),因此选择,固定每个柱的高度,向左右延伸,看看有没有比最大值还要大的矩形。

单调栈是一种很适合这里的数据结构,如果新的元素比栈顶元素大,入栈。如果比栈顶元素小,就一个个弹出,直到栈没有元素或者新元素比栈顶元素大。

  • 元素出栈时,说明新元素是出栈元素向后找第一个比其小的元素。
  • 元素出栈后,说明新栈顶元素是出栈元素向前找第一个比其小的元素。

image-20201226084222202

代码模板如下:

Stack<Integer> s = new Stack<>();
for (int i = 0; i < height.length; ++i) {
    while (!s.isEmpty() && height[s.peek()] > height[i]) {
        s.pop();
    }
    s.push(i);
}

对应于这道题,就要在出栈时进行计算,以比较矩阵大小。

代码如下:

class Solution {
    public int largestRectangleArea(int[] heights) {
        Integer ans = 0;
        int[] height = new int[heights.length + 2];
        height[0] = 0;
        height[height.length - 1] = 0;
        for (int i = 1; i < height.length - 1; ++i) {
            height[i] = heights[i - 1];
        }
        Stack<Integer> s = new Stack<>();
        for (int i = 0; i < height.length; ++i) {
            while (!s.isEmpty() && height[s.peek()] > height[i]) {
                int cur = s.pop();
                int left = s.peek() + 1;
                int right = i - 1;
                Integer temp = (right - left + 1) * height[cur];
                ans = temp.compareTo(ans) == 1 ? temp : ans;
            }
            s.push(i);
        }
        return ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值