给定一个数组,表示连续的地表的高度,求当下雨时,这个连续的地表最多能蓄多少水,比如给定数组[0,1,0,2,1,0,1,3,2,1,2,1]得到结果为6,如下图所示:
分析
对于每个柱子,找到其左右两边最高的柱子,该柱子能容纳的面积就是min(max_left, max_right) - height,这个是问题的本质所在,理解了这个下面的方法就容易理解了。
方法一(三遍扫描):
1. 从左往右扫描一遍,对于每个柱子,求取左边最大值;
2. 从右往左扫描一遍,对于每个柱子,求最大右值;
3. 再扫描一遍,把每个柱子的面积并累加。
代码如下:
int totalWater(vector<int>& vec){
if(vec.size() < 3)