• 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     }
  • 相关阅读:
    mysql安装及初始密码问题
    centos7上安装erlang22.1
    共享文件夹设置
    putty免密登录
    重新开始
    单任务多线程 安全
    线程池
    多线程
    commons-IO
    打印流
  • 原文地址:https://www.cnblogs.com/TheLaughingMan/p/8153793.html
Copyright © 2020-2023  润新知