7 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

复制代码
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 
示例 2:
输入:height = [4,2,0,3,2,5]
输出:9
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105

思路

1、判断参数的合法性。

2、每一格中能装多少水取决于他左边最高的格子和右边最高的格子,假设为left和right。因为木桶效应,装水量主要取决于left和right中最矮的那一根,将其定义为len。

3、循环找到数组中每一格的len,先创建一个存放左边最高格子的数组,再创建一个右边最高格子的数组。

4、计算每一格的储水量,value=len-本身格子的高度,然后所有容量相加。

cpp 复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        int n=height.size();
        if(n<2) return 0;
        vector<int> left_hei(n,0),right_hei(n,0);
        int ans=0;
        int left_max=height[0],right_max=height[n-1];
        for(int i=1;i<n-1;i++){
            left_max=left_max>height[i-1]?left_max:height[i-1];
            left_hei[i]=left_max;
        }
        for(int i=n-2;i>0;i--){
            right_max=right_max>height[i+1]?right_max:height[i+1];
            right_hei[i]=right_max;
        }
        for(int i=1;i<n-1;i++){
            if(height[i]>=min(left_hei[i],right_hei[i])) continue;
            ans+=(min(left_hei[i],right_hei[i])-height[i]);
        }
        return ans;
    }
};
相关推荐
沫璃染墨42 分钟前
从零入门计算机网络系列(十一):HTTP协议进阶——从重定向原理到GET/POST与Fiddler抓包
linux·服务器·开发语言·网络·c++·tcp/ip·html
刚入门的大一新生1 小时前
Linux-线程互斥
java·开发语言
香芋芋圆1 小时前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
揽星河..2 小时前
【C语言】分支和循环
c语言·c++·算法
小熊恋旧2 小时前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合2 小时前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J2 小时前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
will_net3 小时前
apollo 站点部署&C#接入
开发语言·c#·apollo
晗夜未央3 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
熊猫钓鱼>_>3 小时前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc