接雨水的算法

题目

代码

py 复制代码
# 接雨水算法
def trap(height):
    # 1. 特殊情况:数组为空 则返回0
    if not height:
        return 0
    n = len(height)

    # 2. 初始化左右指针,左右最大值,结果
    left, right = 0, n - 1
    # maxleft代表左边最大值,maxright代表右边最大值
    maxleft, maxright = height[0], height[n - 1]
    # ans代表结果
    ans = 0
    # 左右指针相遇时结束
    while left <= right:
        # 更新左右最大值
        maxleft = max(height[left], maxleft)
        maxright = max(height[right], maxright)
        # 判断左右最大值,小的一边进行计算
        # 雨滴的高度为左右最大值中的小值减去当前高度
        if maxleft < maxright:
            ans += maxleft - height[left]
            left += 1
        else:
            ans += maxright - height[right]
            right -= 1
    return ans

# 计算数据 height = [0,1,0,2,1,0,1,3,2,1,2,1]
height = [0,1,0,2,1,0,1,3,2,1,2,1]
print(trap(height))  # 6

思路

中文解释

  1. 特殊情况处理:如果输入的高度数组为空,则返回0。
  2. 初始化 :定义左右指针left和right,分别指向数组的两端。定义maxleft和maxright,分别表示左边和右边的最大值。定义ans用于存储结果。
  3. 循环计算 :当左右指针没有相遇时,进行以下操作:
    • 更新maxleft和maxright,分别为当前指针位置的高度和之前最大值中的较大者。
    • 比较maxleft和maxright,选择较小的一边进行计算:
      • 如果maxleft较小,则计算左边的雨水高度,并将左指针右移。
      • 否则,计算右边的雨水高度,并将右指针左移。
  4. 返回结果 :循环结束后,返回计算得到的雨水总量ans。

图示

以下是一个示例图示,展示了算法的工作原理:

bash 复制代码
高度数组: [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]

初始状态:
left -> 0
right -> 11
maxleft -> 0
maxright -> 1
ans -> 0

每一步的状态变化:
1. left -> 1, maxleft -> 1, ans -> 0
2. right -> 10, maxright -> 2, ans -> 0
3. left -> 2, maxleft -> 1, ans -> 1
4. left -> 3, maxleft -> 2, ans -> 1
5. right -> 9, maxright -> 2, ans -> 2
6. right -> 8, maxright -> 2, ans -> 2
7. right -> 7, maxright -> 3, ans -> 2
8. left -> 4, maxleft -> 2, ans -> 2
9. left -> 5, maxleft -> 2, ans -> 4
10. left -> 6, maxleft -> 2, ans -> 5
11. left -> 7, maxleft -> 3, ans -> 6

最终结果: 6

通过上述步骤,算法计算出总共可以接住6个单位的雨水。

相关推荐
Wang's Blog5 分钟前
Java框架 SpringCloud 快速入门: 服务拆分之服务远程调用
java·开发语言·spring cloud
Evand J7 分钟前
【电机滤波例程1】PMSM永磁同步电机转速与位置估计,MATLAB程序:标准无迹卡尔曼滤波、模型说明与仿真验证
算法·matlab·电机·ekf·负载·卡尔曼滤波
Wang's Blog7 分钟前
Java框架 SpringCloud 快速入门: 路由断言工厂
java·spring·spring cloud
ym hyd 11115 分钟前
门诊挂号系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
杨丰玮41817 分钟前
C语言核心语法
java·c语言·开发语言·学习方法
海宇AI23 分钟前
Java数据工程:利用海宇婚恋风险报告优化高端婚恋实名与涉诉核验合规体验
java·人工智能
打码的老程是远篁25 分钟前
手把手教你玩转大模型——3. Transformer 的位置编码——模型怎么知道谁在前,谁在后?
人工智能·算法
嘎嘎风26 分钟前
MiniMind 学习笔记之 06 一张图、一百行:MiniMind 的骨架
算法·源码
CEZ28 分钟前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·开源
用户73416810354829 分钟前
只盯被动响应做状态监测?论“控制信号”在变工况故障诊断中的重要作用
算法