leetcode 84:Largest Rectangular Area in a Histogram

对于每个柱子,都有一个关于他的矩形,在这个矩形中,这个柱子是最矮的。

只有就算出所有柱子的矩形,再从其中找出最大值,任务就完成了。

如何计算柱子"x'作为最短柱子的矩形面积?

我们需要找出左边第一个比X小的柱子坐标,和右边第一个比X小的柱子坐标。

如何找出左边及右边第一个比X小的柱子呢?

我们需要建立一个堆栈,从左到右加入柱子,栈中存放的是柱子的下标,从左到右加入柱子,当加入的柱子i比栈顶的柱子小时,右边第一个比栈顶X小的柱子坐标已经找到,弹出栈顶柱子。

那么左边第一个比栈顶柱子小的下标是什么呢?

因为柱子是从左到右放入的,并且如果栈顶柱子之前的柱子比X大,那么栈顶柱子之前的柱子应该早就已经弹出。所有栈顶柱子之前的柱子肯定要比栈顶柱子要小。

所有这时候左边和右边第一个比栈顶柱子小的柱子都已经找到了。

如果当遍历到最右边,栈中还有元素没有弹出,说明改元素的右边,没有比他还小的元素。

class Solution{
	public int largestRectangleArea(int[] heights) {
        Stack<Integer> st=new Stack<Integer>();
        int i=0,maxarea=0,area;
        while(i<heights.length){
        	if(st.isEmpty()||heights[st.peek()]<=heights[i]){
        		st.push(i++);
        	}
        	else{
        		int tp=st.pop();
        		area=heights[tp]*(st.empty()?i:i-st.peek()-1);
        		if(area>maxarea){
        			maxarea=area;
        		}
        	}
        }
        while(!st.isEmpty()){
        	int tp=st.pop();
        	area=heights[tp]*(st.empty()?i:i-st.peek()-1);
        	if(area>maxarea){
    			maxarea=area;
    		}
        }
        return maxarea;
    }
}



  • 0
    点赞
  • 0
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值