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.
样例
如上图所示,海拔分别为 [0,1,0,2,1,0,1,3,2,1,2,1]
, 返回 6
.
O(n) 时间, O(1) 空间
O(n) 时间, O(n) 空间也可以接受
首先观察这个图形,可以注意到大致趋势是先增再减,总有一个最高点,水分布在最高点的两端
那么就可以先找到最高点,再从两端向最高点遍历,不断用当前最高点减去当前点得到水量
先找到最高点的原因在于在遍历时候不用担心另一边hold不住
得到两端的水量,最后相加
1 int trapRainWater(vector<int> &heights) { 2 // write your code here 3 if (heights.empty()){ 4 return 0; 5 } 6 7 int max_height=heights[0]; 8 int max_index=0; 9 for(int i=1;i<heights.size();i++){ 10 if(heights[i]>max_height){ 11 max_height=heights[i]; 12 max_index=i; 13 } 14 } 15 16 max_height=heights[0]; 17 int sum=0; 18 for(int i=1;i<max_index;i++){ 19 if(heights[i]<max_height){ 20 sum+=max_height-heights[i]; 21 } 22 max_height=max(max_height, heights[i]); 23 } 24 25 max_height=heights[heights.size()-1]; 26 for(int i=heights.size()-1;i>max_index;i--){ 27 if(heights[i]<max_height){ 28 sum+=max_height-heights[i]; 29 } 30 max_height=max(max_height, heights[i]); 31 } 32 33 return sum; 34 }