您的位置:首页 > Web前端 > AngularJS

leetcode 84:Largest Rectangular Area in a Histogram

2016-10-20 20:45 288 查看


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

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

如何计算柱子"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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: