题目描述
给定 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 };