给出 n 个非负整数,代表一张X轴上每个区域宽度为 1
的海拔图, 计算这个海拔图最多能接住多少(面积)雨水。
样例
样例 1:
输入: [0,1,0]
输出: 0
样例 2:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
挑战
O(n) 时间, O(1) 空间
O(n) 时间, O(n) 空间也可以接受
解题思路:
这道题还可以用单调栈的方法做。按照递减的顺序,每次新进来的高度大于栈顶,就pop出栈顶,然后计算出上面盛水量。
时间复杂度O(n),空间复杂度O(n)
为了更直观理解,画出几个典型状态:
public class Solution {
/**
* @param heights: a list of integers
* @return: a integer
*/
public int trapRainWater(int[] heights) {
// write your code here
Stack<Integer> stack = new Stack<>();//存储下标的单调递减栈
int res = 0;
int curIndex = 0;//遍历的下标
while(curIndex < heights.length){
//当遇到不单调递减元素时
while(!stack.isEmpty() && heights[curIndex] > heights[stack.peek()]){
int top = stack.pop();
if(stack.isEmpty())
break;
//高度 = 两边最小值 - 中间的底高
int h = Math.min(heights[curIndex], heights[stack.peek()]) - heights[top];
//宽度 = 右边- 左边 - 1
int w = curIndex - stack.peek() - 1;
res += h * w;
}
stack.push(curIndex++);
}
return res;
}
}