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 求解柱状图中最大的矩形的主要内容,如果未能解决你的问题,请参考以下文章