1. 直方图中的最大矩形面积

博客分析了如何通过优化算法解决直方图中最大矩形面积的问题,从o(n*n)的时间复杂度优化到o(n)。当高度递增时,可以通过矩阵高度ceiling从高往低遍历;当高度递减时,使用栈构造递增形式。文章重点讨论了ceiling和width的计算,并提供了相应的代码实现。
摘要由CSDN通过智能技术生成

1. 问题分析

首先直观考虑的话该题可以通过遍历的方法去计算,需要n(n+1)/2次计算即可求取矩形面积的最大值,达到o(n*n)的时间复杂度。

在此基础上可以做进一步的优化,可知若直方图中高度的数值是依次增加的,则最大矩形面积必然是随数组下标增加而增大的(宽度变大而高度不会减小),这种情况下的最大矩形面积可以通过矩阵高度ceiling从高往低的一次遍历来求得,ceiling下降则宽度width必须增加才有可能获得一个更大的矩形,ceiling和width都很小的情形就可以不必计算了。

若直方图中高度的数值出现递减,我们依然可以根据此思路利用栈构造出一个递增的形式,获得一个复杂度o(n)的算法。这种思路直观上来讲等同于在非递增时先计算凸出部分的最大矩形面积,然后削掉直方图中的凸出部分,使其变为递增的情形。

由以上思路可以写出如下代码,依次遍历height数组中元素,栈中存储height数组的下标值,使得栈中下标所代表的高度值依次递增,每次出栈的值为当前栈中高度最高数值的下标。该算法的重点在于ceiling和width的求取。

import java.util.Stack;

public class LargestRectangleInHistogram {
	public int largestRectangleArea(int[] height) {    
    	//stack存储height数组的下标
	Stack<Integer> stack = new Stack<>();
    	//最大面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值