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,都要遍历整个数组来寻找左右最大值。在实际

&spm=1001.2101.3001.5002&articleId=155144804&d=1&t=3&u=13bbec8d5f454173bbd262fc5aae6aa1)
2251

被折叠的 条评论
为什么被折叠?



