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 is able to trap after raining. 

For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

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!

 

解决办法:

从左边i开始,依次匹配知道找到高于height[i]的节点,左边的水容量每个点(height[i] - height[j])的值相加,然后从当前最大的点开始依次匹配。

但是这样可能出现起点为最大值,所以调整为采用l和r两个指针,维护装水两边的位置。当l处高度低时,说明l右侧装的水肯定和l处一样高,此时逐步右移l,同是加上l处与右移后位置高度差(因为这里都能装水啊),直到再遇到同样高或者更高的位置。然后进行下一轮判断。同样,当r处高度低时,说明r左侧的水肯定和r处一样高,此时逐步左移r,同是加上r处与左移后位置高度差,直到再遇到同样高或者更高的位置。最后直到l和r相遇,结束。

 

class Solution {
public:
    int trap(vector<int>& height) {
        int left = 0;
        int right = height.size() - 1;
        int sum = 0;
       
        while( left < right )
        {
            int minh = min( height[left] , height[right]);
            
            if( minh == height[left])
            
                while(++left<right && height[left] < minh)
                    sum = sum -height[left] + minh; 
            else
                while(left < --right && height[right] <minh)
                    sum = sum - height[right] + minh; 
        
        }
        return sum;
        
    }
};
原文地址:https://www.cnblogs.com/fengyehe/p/5378602.html