LeetCode 42接雨水问题:从暴力到双指针的5种解法对比(附Python/Java/C++代码)

LeetCode 42接雨水问题:从暴力到双指针的5种解法深度剖析

第一次在面试中遇到接雨水问题时,我盯着那道二维柱状图足足发呆了五分钟。后来才发现,这道看似简单的题目竟然隐藏着如此精妙的算法思维。今天我们就来彻底拆解这道经典题目,从最直观的暴力解法到最优化的双指针方案,一步步探索算法优化的艺术。

1. 问题本质与物理模型

想象一下,这些高低错落的柱子就像城市的天际线。雨水会如何在这些"建筑"之间积聚?关键在于理解木桶效应——每个位置能接住的雨水量,取决于它左右两侧最高柱子中的较小值。

用数学语言描述就是:

water[i] = min(left_max[i], right_max[i]) - height[i]

如果这个差值大于零,则该位置可以积水;否则无法积水。这个简单的公式背后,蕴含着整个问题的核心逻辑。

边界情况处理

  • 第一个和最后一个柱子无法积水(没有左边界或右边界)
  • 当所有柱子高度单调递减或递增时,无法积水

2. 暴力解法:最直观的思路

我们先从最朴素的解法开始,虽然它的时间复杂度高达O(n²),但能帮助我们理解问题本质。

def trap_brute_force(height):
    n = len(height)
    total = 0
    for i in range(1, n-1):  # 首尾柱子不积水
        left_max = max(height[:i])
        right_max = max(height[i+1:])
        water = min(left_max, right_max) - height[i]
        total += max(0, water)
    return total

这个解法的性能瓶颈显而易见:对于每个位置i,都要遍历整个数组来寻找左右最大值。在实际

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值