Java 求解柱状图中最大的矩形

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 求解柱状图中最大的矩形相关的知识,希望对你有一定的参考价值。

一、题目

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

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

二、题解

题目让找出最大的矩形,可以考虑枚举矩形的宽和高,逐个比较以当前柱形高构成的矩形,得到最大的面积

也就是对于每一个柱形,需要往其左边找出第一个比他小的柱形高度,比如5左边第一个比他小的是高度1的柱形,右边第一个比它小的柱形高度是2

所以以该柱形5对应的面积为 5*2=10

对于每一个柱形都需要找到其左边第一个比他小的柱形,以及其右边第一个比它小的柱形

因此采用单调栈的思路进行解题

栈中记录当前柱形对应的第一个比它小的柱形的数组下标

三、代码

class Solution 
    public int largestRectangleArea(int[] heights) 
        int[] left = new int[heights.length];
        int[] right = new int[heights.length];
        Deque<Integer> deque = new LinkedList<>();
        for(int i=0;i<heights.length;i++)
            while(!deque.isEmpty() && heights[deque.peek()]>=heights[i])
                deque.pop();
            
            //栈为空表示往左看当前柱形是最小的高度,即为-1
            left[i] = deque.isEmpty() ? -1:deque.peek();
            deque.push(i);
        
        deque.clear();
        for(int i=heights.length-1;i>=0;i--)
            while(!deque.isEmpty() && heights[deque.peek()]>=heights[i])
                deque.pop();
            
            //栈为空,表示当前柱形往右看是最小的,记为数组长度
            right[i] = deque.isEmpty() ? heights.length:deque.peek();
            deque.push(i);
        
        int res = 0;
        for(int i=0;i<heights.length;i++)
            res = Math.max(res,heights[i]*(right[i]-left[i]-1));
        
        return res;
    

四、总结

每一个元素均需要入栈和出栈一次,时间复杂度为 O ( n ) O(n) O(n)

以上是关于Java 求解柱状图中最大的矩形的主要内容,如果未能解决你的问题,请参考以下文章

java刷题--84柱状图中最大的矩形

LeetCode Java刷题笔记—84. 柱状图中最大的矩形

84. 柱状图中最大的矩形

LeetCode84. 柱状图中最大的矩形

Leetcode 84.柱状图中最大的矩形

84. 柱状图中最大的矩形