接雨水的算法

news/2025/2/24 17:53:53

题目

在这里插入图片描述

代码

# 接雨水算法
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个单位的雨水。


http://www.niftyadmin.cn/n/5864676.html

相关文章

Ubuntu22.04 - brpc的安装和使用

目录 介绍安装使用 介绍 brpc 是用 c语言编写的工业级 RPC 框架&#xff0c;常用于搜索、存储、机器学习、广告、推荐等高性能系统 安装 先安装依赖 apt-get install -y git g make libssl-dev libprotobuf-dev libprotoc-dev protobuf-compiler libleveldb-dev libgflags-d…

51单片机-串口通信编程

串行口工作之前&#xff0c;应对其进行初始化&#xff0c;主要是设置产生波特率的定时器1、串行口控制盒中断控制。具体步骤如下&#xff1a; 确定T1的工作方式&#xff08;编程TMOD寄存器&#xff09;计算T1的初值&#xff0c;装载TH1\TL1启动T1&#xff08;编程TCON中的TR1位…

CentOS 下安装和配置 HTTPD 服务的详细指南

CentOS 下安装和配置 HTTPD 服务的详细指南 CentOS 下安装和配置 HTTPD 服务的详细指南1. 环境准备2. 安装 HTTPD 服务2.1 更新系统2.2 安装 HTTPD2.3 启动 HTTPD 服务2.4 检查 HTTPD 服务状态 3. 配置防火墙3.1 开放 HTTP 和 HTTPS 端口3.2 验证防火墙规则 4. 配置 HTTPD4.1 主…

项目实战--网页五子棋(匹配模块)(4)

上期我们完成了游戏大厅的前端部分内容&#xff0c;今天我们实现后端部分内容 1. 维护在线用户 在用户登录成功后&#xff0c;我们可以维护好用户的websocket会话&#xff0c;把用户表示为在线状态&#xff0c;方便获取到用户的websocket会话 package org.ting.j20250110_g…

【Java 面试 八股文】JVM 虚拟机篇

JVM 虚拟机篇 1. JVM组成1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f;1.2 什么是程序计数器&#xff1f;1.3 你能给我详细的介绍Java堆吗?1.4 Java 虚拟机栈1.4.1 Java Virtual machine Stacks (java 虚拟机栈)1.4.2 栈和堆的区别1.4.3 垃圾回收是否涉及栈内…

2024华为OD机试真题-水仙花数Ⅰ(C++)-E卷B卷-100分

2024华为OD机试最新题库-(C卷+D卷+E卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 用例1 用例2 解题思路 考点 代码 c++ 题目描述 所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。 例如153是水仙花数,153是一个3位数,并且153…

uni-app 系统学习,从入门到实战(一)—— 从零开始搭建第一个跨平台应用

全篇大概 1500 字&#xff0c;建议阅读时间 5min 简介 UniApp 是一个基于 Vue.js 的跨平台开发框架&#xff0c;开发者可以通过编写一套代码&#xff0c;同时发布到 iOS、Android、H5、微信小程序、支付宝小程序、百度小程序等多个平台。本文将带你从零开始&#xff0…

Docker内存芭蕾:优雅调整容器内存的极限艺术

title: “&#x1f4be; Docker内存芭蕾&#xff1a;优雅调整容器内存的极限艺术” author: “Cjs” date: “2025-2-23” emoji: “&#x1fa70;&#x1f4a5;&#x1f4ca;” 当你的容器变成内存吸血鬼时… &#x1f680; 完美内存编排示范 &#x1f4dc; 智能内存管家脚本…