LeetCode.H84.柱状图中最大的矩形

LeetCode.H84.柱状图中最大的矩形

题目:

在这里插入图片描述

题目大意:

​ 如图所示。

数据范围:

1 <= heights.length <=1e5
0 <= heights[i] <= 1e4

思路:

​ 单调栈:分析问题,对于每个柱子,分别寻找其左边比它低的且距离最近的柱子(下标为l,如果没有则为-1),和右边比它低的且距离最近的柱子(下标为r,如果没有则为n)。那么这个高度等于这个柱子的矩形的面积为 (r - l) * height[i]。

​ 那么问题就变成了如何找到两边比它低的且距离最近的柱子

​ 对于左边:问题相当于找到每个数左边第一个比它小的数的下标,如果没有则为 -1,即【单调栈】。

​ 对于左边:问题相当于找到每个数右边第一个比它小的数的下标,如果没有则为 n,即使用单调栈,从后向前遍历。

计算每个柱子所能构成最大的面积即可。

代码:

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;

class Solution {
    public int largestRectangleArea(int[] heights) {
        Deque<Integer> stk = new ArrayDeque<>();
        int[] lrange = new int[heights.length];
        for (int i = 0; i < heights.length; i ++ ){
            while (!stk.isEmpty() && heights[stk.peek()] >= heights[i]){
                stk.pop();
            }
            lrange[i] = stk.isEmpty() ? -1 : stk.peek();
            stk.push(i);
        }
        stk.clear();
        int[] rrange = new int[heights.length];
        for (int i = heights.length - 1; i >= 0; i -- ){
            while (!stk.isEmpty() && heights[stk.peek()] >= heights[i]){
                stk.pop();
            }
            rrange[i] = stk.isEmpty() ? heights.length : stk.peek();
            stk.push(i);
        }
        int ans = -1;
        for (int i = 0; i < heights.length; i ++ ){
            ans = Math.max(ans, (rrange[i] - lrange[i] - 1) * heights[i]);
        }

        return ans;
    }
}

public class Main {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] heights = new int[]{3,2,6,5,1,2};
        System.out.println(solution.largestRectangleArea(heights));
    }
}

时空复杂度分析等:

  • 时间复杂度 : O(n)

  • 空间复杂度 : O(n)

题目链接:

84. 柱状图中最大的矩形 - 力扣(LeetCode)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值