84.柱状图中最大的矩形(困难)

该博客介绍了如何解决寻找柱状图中最大矩形的问题,主要思路是利用单调栈来实现。文章提到题意是判断当前高度是否大于前一个,如果是则继续,否则移除栈顶元素并继续比较。博客强调使用ArrayDeque作为栈的实现,因为其性能优于ArrayList和LinkedList,同时也指出Java中Stack的不推荐使用。文章内容包含了详细的解题思路和原始代码的简化过程。
摘要由CSDN通过智能技术生成

思路:

题意可以理解为比较当前是否比前一个小,大则继续,小则去掉前一个,并且继续往前比较

很容易想到要使用单调栈

 

 

代码:

class Solution {
    public int largestRectangleArea(int[] heights) {
		int n=heights.length,max=0;
		Deque<Integer> stack=new ArrayDeque<>();
		for(int i=0;i<=n;i++){
			//条件是:1.不为空  2.当前height小于栈顶端的height  3.i到了最后
			while(!stack.isEmpty()&&(i==n||heights[i]<heights[stack.peekLast()])){
                //先一步把值弹出,下面算的peekLast就是再前一个的下标
				int height=heights[stack.removeLast()];
				int width=stack.isEmpty()?i:i-1-stack.peekLast();
				max=Math.max(max,height*width);
			}
			//若不满足while的条件,就把值压入栈中(heights[i]>heights[stack.peek()])
			stack.addLast(i);
		}
		return max;
    }
}

 

分解:

1)使用ArrayDeque,而不是ArrayList,或是LinkedList,或者是Stack

原因是ArrayDeque和ArrayList是数组形式,而LinkedList是链表形式,而Stack在Java中则不建议使用(具体可以查看写的另一篇博文https://blog.csdn.net/di_ko/article/details/115004162

 

2)

int height=heights[stack.removeLast()];
int width=stack.isEmpty()?i:i-1-stack.peekLast();

这几行代码其实有所简略,原始版本是:

int height=heights[stack.peekLast()];
int width=stack.isEmpty()?i:i-stack.peekLast();
stack.removeLast();

 

3)while循环之外的以下代码其实也有所简略

stack.addLast(i);

原始版本:

whie(...){
	stack.addLast(i);
}

if(heights[i]<heights[stack.peekLast()]){
	stack.addLast(i);
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值