接雨水的算法

打印 上一主题 下一主题

主题 908|帖子 908|积分 2724

题目


代码

  1. # 接雨水算法
  2. def trap(height):
  3.     # 1. 特殊情况:数组为空 则返回0
  4.     if not height:
  5.         return 0
  6.     n = len(height)
  7.     # 2. 初始化左右指针,左右最大值,结果
  8.     left, right = 0, n - 1
  9.     # maxleft代表左边最大值,maxright代表右边最大值
  10.     maxleft, maxright = height[0], height[n - 1]
  11.     # ans代表结果
  12.     ans = 0
  13.     # 左右指针相遇时结束
  14.     while left <= right:
  15.         # 更新左右最大值
  16.         maxleft = max(height[left], maxleft)
  17.         maxright = max(height[right], maxright)
  18.         # 判断左右最大值,小的一边进行计算
  19.         # 雨滴的高度为左右最大值中的小值减去当前高度
  20.         if maxleft < maxright:
  21.             ans += maxleft - height[left]
  22.             left += 1
  23.         else:
  24.             ans += maxright - height[right]
  25.             right -= 1
  26.     return ans
  27. # 计算数据 height = [0,1,0,2,1,0,1,3,2,1,2,1]
  28. height = [0,1,0,2,1,0,1,3,2,1,2,1]
  29. print(trap(height))  # 6
复制代码
思路

中文表明


  • 特殊环境处理:如果输入的高度数组为空,则返回0。
  • 初始化:定义左右指针left和right,分别指向数组的两端。定义maxleft和maxright,分别表现左边和右边的最大值。定义ans用于存储结果。
  • 循环盘算:当左右指针没有相遇时,进行以下操作:

    • 更新maxleft和maxright,分别为当前指针位置的高度和之前最大值中的较大者。
    • 比较maxleft和maxright,选择较小的一边进行盘算:

      • 如果maxleft较小,则盘算左边的雨水高度,并将左指针右移。
      • 否则,盘算右边的雨水高度,并将右指针左移。


  • 返回结果:循环结束后,返回盘算得到的雨水总量ans。
图示

以下是一个示例图示,展示了算法的工作原理:
  1. 高度数组: [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
  2. 初始状态:
  3. left -> 0
  4. right -> 11
  5. maxleft -> 0
  6. maxright -> 1
  7. ans -> 0
  8. 每一步的状态变化:
  9. 1. left -> 1, maxleft -> 1, ans -> 0
  10. 2. right -> 10, maxright -> 2, ans -> 0
  11. 3. left -> 2, maxleft -> 1, ans -> 1
  12. 4. left -> 3, maxleft -> 2, ans -> 1
  13. 5. right -> 9, maxright -> 2, ans -> 2
  14. 6. right -> 8, maxright -> 2, ans -> 2
  15. 7. right -> 7, maxright -> 3, ans -> 2
  16. 8. left -> 4, maxleft -> 2, ans -> 2
  17. 9. left -> 5, maxleft -> 2, ans -> 4
  18. 10. left -> 6, maxleft -> 2, ans -> 5
  19. 11. left -> 7, maxleft -> 3, ans -> 6
  20. 最终结果: 6
复制代码
通过上述步骤,算法盘算出总共可以接住6个单元的雨水。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表