算法思路:
栈内存放从小到大或者从大到小的数据,比如:计算某个值左右两边都比它小,才能计算,可以使用单调栈,把数推进栈内,遇到小的就计算结果。
场景:
- 需要找出ABA这个场景,A比B大或者小,就可以以AAAB存储数据,遇到下一个A就可以计算B了。
模版:
循环从左到右的最后一个元素+1:
While(栈不为空 && 栈顶元素比现有的数据大)
计算栈顶元素信息
计算目前到栈顶元素的距离信息
计算栈顶元素的结果
把现有的index推进栈里。
返回结果。
int area = 0;
for(int i = 0; i <= heights.length; i++) {
int curH = i == heights.length ? Integer.MIN_VALUE : heights[i];
while(!stack.isEmpty() && heights[stack.peek()] > curH) {
int h = heights[stack.pop()];
int w = stack.isEmpty()? i : i - stack.peek() - 1;
area = Math.max(area, h * w);
}
stack.push(i);
}
适用题目:
如果需要一个元素从小到大排列,算出它左右两边比它高或者低的值,可以用单调栈解决。
分析:接雨水,一个单元的水容量=左边最近比它高的,右边最近比它高的。 因此使用递减栈: 比如:4,3,2,1 1左边是第一个比它高的,而数组下一个遇到比它高的就可以计算它的容水量了。 由于第一个元素和第二个元素不需要计算,下标就到数组的最后一个元素就可以了。
-
leetcode 84. Largest Rectangle in Histogram 也可以使用单调栈解决。读者可以自己尝试解决一下。