42. Trapping Rain Water

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

Rust Solution

struct Solution;

impl Solution {
    fn trap(height: Vec<i32>) -> i32 {
        let n = height.len();
        if n == 0 {
            return 0;
        }
        let mut l = 0;
        let mut r = n - 1;
        let mut level = 0;
        let mut res = 0;
        while l < r {
            if height[l] < height[r] {
                let lower = height[l];
                level = level.max(lower);
                res += level - lower;
                l += 1;
            } else {
                let lower = height[r];
                level = level.max(lower);
                res += level - lower;
                r -= 1;
            }
        }
        res
    }
}

#[test]
fn test() {
    let height = vec![0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1];
    let res = 6;
    assert_eq!(Solution::trap(height), res);
}

Having problems with this solution? Click here to submit an issue on github.