返回

接雨水——优化思路,精妙算法,尽享水花四溅的乐趣

前端






接雨水——优化思路,精妙算法,尽享水花四溅的乐趣!

在算法的世界里,leetcode的42号问题——接雨水,犹如一场精妙的博弈,考验着程序员的智慧与灵感。

雨水,从天而降,汇聚成涓涓细流,最终汇入江河湖海。然而,当雨水落在建筑物的屋顶上,却化作一滴滴晶莹的珠子,在屋檐下留下斑驳的痕迹。

如何接住这些雨水,让它们发挥更大的价值?这就是我们今天要探讨的问题。

一、问题背景

在一个宽阔的平台上,竖立着n个宽度为1的柱子,柱子的高度由数组height表示。当雨水落在平台上时,会在柱子之间形成一个个水洼。

我们的任务是计算出平台上能接住的最大雨水量。

二、优化思路

面对这个看似复杂的问题,我们可以用一种巧妙的思路将其化繁为简。

首先,我们将问题分解为若干个小问题:

  1. 在两个相邻柱子之间,雨水能积聚到多高?
  2. 在整个平台上,雨水能积聚到最高处是多少?
  3. 如何计算出平台上能接住的最大雨水量?

有了这些小问题的指引,我们就可以一步步攻克难题。

三、精妙算法

  1. 计算两个相邻柱子之间的雨水量

    对于两个相邻柱子,我们可以用如下公式计算出它们之间能积聚的雨水量:

    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个柱子的高度。
  2. 计算整个平台上雨水能积聚到最高处

    为了计算出整个平台上雨水能积聚到最高处,我们可以用如下算法:

    max_height = max(height)
    

    其中:

    • max_height表示整个平台上雨水能积聚到最高处。
    • height为柱子高度数组。
  3. 计算平台上能接住的最大雨水量

    最后,我们可以用如下公式计算出平台上能接住的最大雨水量:

    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

五、结语

接雨水问题,看似复杂,实则蕴含着精妙的算法思想。通过巧妙的思路分解和精妙的算法设计,我们可以轻松解决这个问题。

在算法的世界里,没有一劳永逸的解决办法,只有不断探索和创新。希望这篇文章能为你带来新的启发,助你在算法的海洋中乘风破浪,勇往直前!