当前位置: 首页 > news >正文

接雨水的算法

题目

在这里插入图片描述

代码

# 接雨水算法
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. 初始化:定义左右指针leftright,分别指向数组的两端。定义maxleftmaxright,分别表示左边和右边的最大值。定义ans用于存储结果。
  3. 循环计算:当左右指针没有相遇时,进行以下操作:
    • 更新maxleftmaxright,分别为当前指针位置的高度和之前最大值中的较大者。
    • 比较maxleftmaxright,选择较小的一边进行计算:
      • 如果maxleft较小,则计算左边的雨水高度,并将左指针右移。
      • 否则,计算右边的雨水高度,并将右指针左移。
  4. 返回结果:循环结束后,返回计算得到的雨水总量ans

图示

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

高度数组: [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个单位的雨水。

相关文章:

  • Linux nc 命令详解
  • Android Studio2024版本安装环境SDK、Gradle配置
  • 《Linux命令行和shell脚本编程大全》第一章阅读笔记
  • 【YOLOv8】YOLOv8改进系列(2)----替换主干网络之FasterNet(CVPR 2023)
  • Unity VRoid+Blender+Unity 3D人物模型导入使用
  • 【Vue3+Tres 三维开发】03 - 基本操作
  • 二分图检测算法以及最大匹配算法(C++)
  • eclipse 运行工程报错in thread “main“ java.lang.OutOfMemoryError: Java heap space
  • BeautifulSoup、lxml/XPath和正则表达式在数据爬取中的核心差异及适用场景
  • 如何在java中用httpclient实现rpc get请求
  • Faster-RCNN与DETR:遥感影像目标检测的对比与选择
  • IDEA通过Maven使用JBLJavaToWeb插件创建Web项目
  • 算法1-2 排序(快排)
  • 智能合约与区块链中的NLP应用:自动化法律文书分析与合同审查【附核心实战代码】
  • 通过C语言实现“数据结构”课程中的链表,数据,数,图
  • Linux-Ansible模块扩展
  • 基于Java的实时数据流处理框架设计与实现
  • 从训练到部署:基于YOLOv5和TensorRT的人脸口罩检测系统全流程实战指南(开源代码)
  • 修改`FSL Yocto Project Community BSP`用到的u-boot源码,使其能适配百问网(100ask)的开发板
  • 架构师面试(六):熔断和降级
  • 网站推广策划报告航空航天/国外常用的seo站长工具
  • 什么是网络营销设计/淘宝关键词优化技巧教程
  • 代理网店怎么开/快速网站排名优化
  • 腾龙时时彩做号软件官方网站/网站结构优化
  • 郑州app拉新项目/长沙seo顾问
  • 门户网站定制服务器/软文推广软文营销