接雨水的算法

news/2025/2/24 23:47:03/

题目

在这里插入图片描述

代码

# 接雨水算法
def trap(height):# 1. 特殊情况:数组为空 则返回0if not height:return 0n = 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 += 1else:ans += maxright - height[right]right -= 1return 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.ppmy.cn/news/1574718.html

相关文章

DeepSeek从入门到精通(清华大学)

​ DeepSeek是一款融合自然语言处理与深度学习技术的全能型AI助手&#xff0c;具备知识问答、数据分析、编程辅助、创意生成等多项核心能力。作为多模态智能系统&#xff0c;它不仅支持文本交互&#xff0c;还可处理文件、图像、代码等多种格式输入&#xff0c;其知识库更新至2…

TOGAF之架构标准规范-信息系统架构 | 应用架构

TOGAF是工业级的企业架构标准规范&#xff0c;信息系统架构阶段是由数据架构阶段以及应用架构阶段构成&#xff0c;本文主要描述信息系统架构阶段中的应用架构阶段。 如上所示&#xff0c;信息系统架构&#xff08;Information Systems Architectures&#xff09;在TOGAF标准规…

Jenkins 配置 Credentials 凭证

Jenkins 配置 Credentials 凭证 一、创建凭证 Dashboard -> Manage Jenkins -> Manage Credentials 在 Domain 列随便点击一个 (global) 二、添加 凭证 点击左侧 Add Credentials 四、填写凭证 Kind&#xff1a;凭证类型 Username with password&#xff1a; 配置 用…

复现论文:DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization

论文&#xff1a;[2403.16697] DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization github: TYLfromSEU/DPStyler: DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization 论文: 这篇论文还是在PromptStyler:Prompt-driven Style Gener…

FPGA中利用fifo时钟域转换---慢时钟域转快时钟域

FPGA中利用fifo时钟域转换—慢时钟域转快时钟域 一、时间计算方法 FIFO的输入数据的时钟是40MHz&#xff0c;FIFO输出数据取60MHz&#xff0c;刚好是40MHz的1.5倍&#xff0c;将慢时钟域转快时钟域。另外&#xff0c;fifo输出的数据&#xff0c;要输出给上位机&#xff0c;一…

什么是 Vue 的自定义事件?如何触发和监听?

Vue 的自定义事件详解 什么是自定义事件&#xff1f; 在 Vue 中&#xff0c;自定义事件是组件之间通信的重要机制。自定义事件允许子组件向父组件发送消息&#xff0c;通常用于处理用户交互或异步操作的结果。这种机制使得组件间的通信更加灵活和解耦。 自定义事件的基本概念…

八大排序算法(1)插入排序-直接插入排序 和 希尔排序

直接插入排序&#xff08;Insertion Sort&#xff09; 直接插入排序是最基本的插入排序算法&#xff0c;工作原理如下&#xff1a; 从第二个元素开始&#xff0c;将其与前面已经排好序的部分进行比较。 找到合适的位置后&#xff0c;将该元素插入到合适的位置&#xff0c;同…

力扣——杨辉三角

题目链接&#xff1a; 链接 题目描述&#xff1a; 思路&#xff1a; 直接找规律&#xff0c;按照数学的思路来 每一行的列最大索引 < 行索引 实现代码&#xff1a; class Solution {public List<List<Integer>> generate(int numRows) {List<List<In…