ToB企服应用市场:ToB评测及商务社交产业平台

标题: 接雨水的算法 [打印本页]

作者: 莫张周刘王    时间: 5 天前
标题: 接雨水的算法
题目


代码

  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
复制代码
思路

中文表明

图示

以下是一个示例图示,展示了算法的工作原理:
  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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4