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; } };