问题描述
给定一个非负整数的数组,每个数字代表柱子的长度,要求计算出这些柱子组成的容器可以存储的雨水量。题目链接:**点我**
样例输入输出
输入:[0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
输入:[5,4,3,2,1,0,1,2,3,4,5]
输出:25
问题解法
循环遍历数组,分别计算每个位置能够存储的雨水量,将其相加得到最终答案。为了能得到每个位置能够存储的雨水量,可以用双指针的方式逐渐缩小范围。
开始时,两个指针分别在数组首尾处。
 
如果左边的柱子小于右边的柱子,则用另一个指针在两根柱子之间从左到右进行移动,如果当前位置柱子长度小于左边的柱子,则计算当前位置能够存储的雨水量,将其加入总的蓄水量中,否则将左边柱子的位置移动到当前位置。
 
如果左边的柱子大于右边的柱子,则用另一个指针在两根柱子之间从右到左进行移动,如果当前位置柱子长度小于右边的柱子,则计算当前位置能够存储的雨水量,将其加入总的蓄水量中,否则将右边柱子的位置移动到当前位置。
 
重复上述过程直到左右两个柱子相邻,此时的蓄水总量就是要求的答案。
 
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
   | class Solution  {     public int trap(int[] height)      {         if (height == null || height.length <= 1)         {             return 0;         }                  int left = 0;         while (height[left] == 0)         {             left++;         }                  int right = height.length - 1;         while (height[right] == 0)         {             right--;         }
          int sum = 0;         while (left < right)         {             if (height[left] < height[right])             {                 int index = left + 1;                 while (height[index] < height[left])                 {                     sum += height[left] - height[index];                     index++;                 }                                  left = index;             }             else             {                 int index = right - 1;                 while (height[index] < height[right])                 {                     sum += height[right] - height[index];                     index--;                 }                                  right = index;             }         }                  return sum;     } }
   |