主题思想: 这是一道求最值问题,一般这种问题,是动态规划问题,一种最容易想到的方法是,用一根线扫描,这样有多少个高度就需要多少根线,没扫描一次,O(n) 总的就是 n^2
这里利用栈的思想: 如果一个条状,他后面的条高度比他高,那么这个条状肯定不是最大面积的终止条,因为扩展到后面的条面积就增加了,所以,只有出现下降条时,才可能出现最大值。 所以用栈维护一个单调非递减数值,记录下标,遇见当前条比栈顶小,就出栈,统计可能出现的最大值,
这里有个特殊情况,对于栈中最底层的元素,在栈底下标之前的条,都比他大,所以应该长应该是i ,其余的应该是i- stack.peekFirst()-1.
AC 代码:
public int getMaxHistorgram(int [] heights){
if(heights==null) return 0;
int n=heights.length;
// need add a end flag so ,i can be equal to n
int tmp=0;
int mx=0;
Deque<Integer> stack=new ArrayDeque<Integer>();
for(int i=0;i<=n;i++){
tmp=(i==n?0:heights[i]);
if(stack.isEmpty()||tmp>=heights[stack.peekFirst()]){
stack.push(i);
}else{
tmp=stack.pop();
mx=Math.max(mx,heights[tmp]*(stack.isEmpty()?i:i-stack.peekFirst()-1));
i--; //important
}
}
return mx;
}
}
这是一篇关于动态规划和栈的应用问题,主要解决的是在柱状图中找到最大矩形的面积。通常此类最值问题是动态规划的经典题目,但此题采用栈的思想来优化,通过维护一个单调非递减栈来跟踪可能的最大面积,当遇到下降的柱子时,可能存在最大矩形,更新答案。特殊情况是,栈底元素左侧的柱子高度都小于它,因此宽度可能是当前索引i,而右侧宽度为i - 栈顶元素索引 - 1。

被折叠的 条评论
为什么被折叠?



