363. 接雨水

Posted 三人木君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.

技术分享图片

 

样例

如上图所示,海拔分别为 [0,1,0,2,1,0,1,3,2,1,2,1], 返回 6.

 

挑战 

O(n) 时间, O(1) 空间

O(n) 时间, O(n) 空间也可以接受

 

首先观察这个图形,可以注意到大致趋势是先增再减,总有一个最高点,水分布在最高点的两端

那么就可以先找到最高点,再分别向两端遍历,得到两端的水量,最后相加

 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     }

 

以上是关于363. 接雨水的主要内容,如果未能解决你的问题,请参考以下文章

java刷题--42接雨水

LeetCode-6:接雨水

leetcode 每日一题 42. 接雨水

leetcode 每日一题 42. 接雨水

每日一题:42. 接雨水

LeetCode42题动态规划 - 接雨水