(java)leetcode-84:Largest Rectangle in Histogram

Largest Rectangle in Histogram

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.


Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].


The largest rectangle is shown in the shaded area, which has area = 10 unit.

For example,
Given heights = [2,1,5,6,2,3],
return 10.


解题思路:

这道题算是让我弄了很久,一直都是超时。后面解出来也是借鉴了别人的想法。

大致的思路就是:用一个stack来存储下标。当一个数值(设下标为c)比stack的栈顶下标对应的值(a1)小的时候,说明a1没法到达目前的下标,所以就把栈顶弹出。然后再获得下一个栈顶值。该栈顶值到c之间的距离就是a1所能覆盖的长方形的宽。不断循环下去直到stack为空或者栈顶下标对应的值小于等于当前值。这样不断循环下去就可以了。(感觉好难解释....)


public class Solution {
    public int largestRectangleArea(int[] heights) {
        Stack<Integer> indexstack = new Stack<>();
		int result = 0;
		int length = heights.length;
		for(int i = 0;i<length;i++)
		{
			
			while(!indexstack.empty() && heights[indexstack.peek()]>heights[i])
			{
				int height = heights[indexstack.pop()];
				if(!indexstack.empty())
					result = Math.max(result, height*(i-indexstack.peek()-1));
				else
					result = Math.max(result, height*i);
			}
			if(indexstack.empty() || heights[indexstack.peek()]<=heights[i])
				indexstack.push(i);
		}
		while(!indexstack.empty())
		{
			int height = heights[indexstack.pop()];
			if(!indexstack.empty())
				result = Math.max(result, height*(length-indexstack.peek()-1));
			else
				result = Math.max(result, height*length);
		}
		return result;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值