42. Trapping Rain Water 接雨水

题目链接
tag:

  • Hard;
  • Two Pointers;

question:
  Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

The above elevation map 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. Thanks Marcos for contributing this image!

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6

思路:
  我们需要left和right两个指针分别指向数组的首尾位置,从两边向中间扫描,在当前两指针确定的范围内,先比较两头找出较小值,如果较小值是left指向的值,则从左向右扫描,如果较小值是right指向的值,则从右向左扫描,若遇到的值比当前较小值小,则将差值存入结果,如遇到的值大,则重新确定新的窗口范围,以此类推直至left和right指针重合,具体参见代码如下:

class Solution {
public:
    int trap(vector& height) {
        int res = 0, left = 0, right = height.size() - 1;
        while (left < right) {
            int mn = min(height[left], height[right]);
            if (mn == height[left]) {
                ++left;
                while (left < right && height[left] < mn) 
                    res += mn - height[left++];
            } 
            else {
                --right;
                while (left < right && height[right] < mn)
                    res += mn - height[right--];
            }
        }
        return res;
    }
};

你可能感兴趣的:(42. Trapping Rain Water 接雨水)