价值:记录学习过程的思考,本身就是一场动态规划的前生,记忆化搜索。
单调栈:及时去掉无用数据,保证栈中数据有序。
Problem: 42. 接雨水
思路
// 《单调不增栈》
//左、左的下一个、当前right
//计算状态:高度= min(当前right - 左) - 低洼处柱子高度
//。 横着宽度 right - 左 -1 (内)
//算完这一块之后,填坑,下一次循环 左、上一次的right(低洼) 、 当前right
Code
class Solution {
public int trap(int[] height) {
int n = height.length;
int ans = 0;
Deque<Integer> stack = new ArrayDeque<>();
//左、左的下一个、当前right
//计算状态:高度= min(当前right - 左) - 低洼处柱子高度
//。 横着宽度 right - 左 -1 (内)
//算完这一块之后,填坑,下一次循环 左、上一次的right(低洼) 、 当前right
for(int right = 0; right < n ; right++){
while(!stack.isEmpty() && height[right] > height[stack.peekLast()]){
//中间柱子位置
int bottom = stack.pollLast();
if(stack.isEmpty()){
break;
}
//左墙位置 以及左墙、右墙、低洼处高度
int left = stack.peekLast();
//取出高度
int lh = height[left];
int rh = height[right];
int bottom_h = height[bottom];
//围成小坑
int dh = Math.min(lh,rh) - bottom_h;
ans += dh * (right - left - 1);
}
//用当前right结算完成后,一马平川,继续寻找比栈顶 大的 进行结算低洼处。
stack.addLast(right);
}
return ans;
}
}