Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it can trap after raining.
Example 1:
Input: height = [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
Explanation: The above elevation map (black section) is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped.
Example 2:
Input: height = [4,2,0,3,2,5]
Output: 9
Constraints:
n == height.length
0 <= n <= 3 * 104
0 <= height[i] <= 105
这道题的关键是得把思维转个90°,我们不计算一个个水立柱的面积,而是一层层的进行横扫。
impl Solution {
pub fn trap(height: Vec<i32>) -> i32 {
if height.is_empty() {
return 0;
}
let max_height = *height.iter().max().unwrap();
let mut ans = 0;
'outer: for h in 1..=max_height {
let mut idx = 0;
'mid: while idx < height.len() {
if height[idx] < h {
idx += 1;
} else {
for j in idx + 1..height.len() {
if height[j] >= h {
ans += j - idx - 1;
idx = j;
continue 'mid;
}
}
continue 'outer;
}
}
}
ans as i32
}
}