返回
接雨水——优化思路,精妙算法,尽享水花四溅的乐趣
前端
2023-10-09 03:22:53
接雨水——优化思路,精妙算法,尽享水花四溅的乐趣!
在算法的世界里,leetcode的42号问题——接雨水,犹如一场精妙的博弈,考验着程序员的智慧与灵感。
雨水,从天而降,汇聚成涓涓细流,最终汇入江河湖海。然而,当雨水落在建筑物的屋顶上,却化作一滴滴晶莹的珠子,在屋檐下留下斑驳的痕迹。
如何接住这些雨水,让它们发挥更大的价值?这就是我们今天要探讨的问题。
一、问题背景
在一个宽阔的平台上,竖立着n个宽度为1的柱子,柱子的高度由数组height表示。当雨水落在平台上时,会在柱子之间形成一个个水洼。
我们的任务是计算出平台上能接住的最大雨水量。
二、优化思路
面对这个看似复杂的问题,我们可以用一种巧妙的思路将其化繁为简。
首先,我们将问题分解为若干个小问题:
- 在两个相邻柱子之间,雨水能积聚到多高?
- 在整个平台上,雨水能积聚到最高处是多少?
- 如何计算出平台上能接住的最大雨水量?
有了这些小问题的指引,我们就可以一步步攻克难题。
三、精妙算法
-
计算两个相邻柱子之间的雨水量
对于两个相邻柱子,我们可以用如下公式计算出它们之间能积聚的雨水量:
water[i] = min(max_left[i], max_right[i]) - height[i]
其中:
- water[i]表示第i个柱子与相邻柱子之间能积聚的雨水量。
- max_left[i]表示第i个柱子左边最高柱子的高度。
- max_right[i]表示第i个柱子右边最高柱子的高度。
- height[i]表示第i个柱子的高度。
-
计算整个平台上雨水能积聚到最高处
为了计算出整个平台上雨水能积聚到最高处,我们可以用如下算法:
max_height = max(height)
其中:
- max_height表示整个平台上雨水能积聚到最高处。
- height为柱子高度数组。
-
计算平台上能接住的最大雨水量
最后,我们可以用如下公式计算出平台上能接住的最大雨水量:
total_water = 0 for i in range(n): total_water += water[i]
其中:
- total_water表示平台上能接住的最大雨水量。
- water为柱子之间雨水量数组。
- n为柱子的数量。
四、代码实现
def trap(height):
n = len(height)
if n < 3:
return 0
max_left = [0] * n
max_right = [0] * n
max_left[0] = height[0]
max_right[n - 1] = height[n - 1]
for i in range(1, n):
max_left[i] = max(max_left[i - 1], height[i])
for i in range(n - 2, -1, -1):
max_right[i] = max(max_right[i + 1], height[i])
water = [0] * n
for i in range(n):
water[i] = min(max_left[i], max_right[i]) - height[i]
total_water = 0
for i in range(n):
total_water += water[i]
return total_water
# 测试代码
height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
print(trap(height)) # 6
五、结语
接雨水问题,看似复杂,实则蕴含着精妙的算法思想。通过巧妙的思路分解和精妙的算法设计,我们可以轻松解决这个问题。
在算法的世界里,没有一劳永逸的解决办法,只有不断探索和创新。希望这篇文章能为你带来新的启发,助你在算法的海洋中乘风破浪,勇往直前!