42. Trapping Rain Water 接雨水问题
https://blog.csdn.net/qq_17550379/article/details/84945427
描述:给定 n 个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
解法一:单调栈调用
一个栈存的数值递减,如果当前元素小于栈顶元素,则进栈;如果大于栈顶元素,先弹出栈顶元素,然后看栈中的前一个元素
class Solution {
public int trap(int[] height) {
// 栈中元素从大到小
Stack<Integer> stack = new Stack<>();
int res = 0;
for (int i = 0; i < height.length; i++) {
// 2. 出栈条件:当前元素大于栈顶元素
while(!stack.isEmpty() && height[stack.peek()] < height[i]) {
int top = stack.pop();
if (stack.isEmpty()) {
break;
}
if (height[top] == height[stack.peek()]) {
continue;
}
res += (i - stack.peek() - 1) * (Math.min(height[stack.peek()], height[i]) - height[top]);
}
// 1. 如果当前元素小于栈顶元素则进栈
stack.push(i);
}
return res;
}
}
引申: 单调栈主要回答这样几种问题:
1. 比当前元素更大的下一个元素;
2. 比当前元素更大的前一个元素;
3. 比当前元素更小的下一个元素;
4. 比当前元素更小的前一个元素
拿2.举例,比当前元素更大的前一个元素:
Step1. 单调栈中存数据的下标,如果栈中数据为空,则 res[i] = i <当前元素下标>,并将 i 压栈;
如果当前栈顶元素 > 当前元素,则 res[i] = 栈顶值,并将 i 压栈;
如果当前栈顶元素 < 当前元素,则出栈,然后继续 Step1.