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     }

 

转载于:https://www.cnblogs.com/TheLaughingMan/p/8153793.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值