363. 接雨水

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.

Trapping Rain Water

 

样例

如上图所示,海拔分别为 [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     }

 

posted @ 2017-12-31 04:14  三人木君  阅读(173)  评论(0编辑  收藏  举报