欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 接雨水的算法

接雨水的算法

2025/2/26 3:53:14 来源:https://blog.csdn.net/qq_40603125/article/details/145815644  浏览:    关键词:接雨水的算法

题目

在这里插入图片描述

代码

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词