LeetCode 42. 接雨水(Trapping Rain Water)

题目描述

 

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

 

解题思路

 

基本思想是从数组首位置找到第一个大于其紧邻后面的数,将它作为第一个雨槽的左挡板,然后向后遍历找到第一个不小于它的的数作为右挡板,这两个高度之间即可构成一个容器,遍历中间的高度依次计算盛水单位,然后继续以此右挡板作为下一个雨槽的左挡板。如果没有找到不小于左挡板的高度,则把此段雨槽反过来重新按照之前的算法计算盛水容量。

 

代码

 

 1 class Solution {
 2 public:
 3     int trap(vector<int>& height) {
 4         int res = 0;
 5         if(height.size() < 3) return res;
 6         int left = 0;
 7         while(left < height.size() - 1 && height[left] <= height[left + 1])
 8             left++;
 9         if(left == height.size() - 1) return res;
10         int right = left + 1;
11         while(right < height.size()){
12             if(height[right] >= height[left]){
13                 for(int i = left + 1; i < right; i++)
14                     res += height[left] - height[i];
15                 left = right;
16                 right = left + 1;
17             }
18             else if(right == height.size() - 1){
19                 vector<int> hr;
20                 for(int i = right; i >= left; i--)
21                     hr.push_back(height[i]);
22                 res += trap(hr);
23                 break;
24             }
25             else right++;
26         }
27         return res;
28     }
29 };

 

posted @ 2018-08-29 21:15  FlyingWarrior  阅读(286)  评论(0编辑  收藏  举报