1. 问题分析与核心思路
这道接雨水问题在力扣上编号42,属于经典的数组处理类难题。我第一次遇到这个问题时,直观想到的是暴力解法——对于每个位置,分别向左向右寻找最高柱子,然后计算当前格子能接的雨水。但这种方法时间复杂度高达O(n²),显然不够高效。
经过反复思考和实践,我发现双指针法是最优雅的解决方案。其核心思想可以用一个简单的公式表达:
code复制当前格子接水量 = min(左边最高柱子, 右边最高柱子) - 当前柱子高度
这个公式背后其实蕴含着"木桶效应"的原理——一个木桶能装多少水,取决于最短的那块木板。在接雨水问题中,每个位置能接的雨水量,取决于它左右两侧最高柱子中较矮的那个。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 双指针解法详解
2.1 算法流程解析
让我们用示例 height = [0,1,0,2,1,0,1,3,2,1] 来详细拆解双指针法的执行过程:
-
初始化:
- 左指针
left = 0,右指针right = len(height) - 1 = 9 - 左边最大值
left_max = height[0] = 0 - 右边最大值
right_max = height[9] = 1 - 总接水量
water = 0
- 左指针
-
第一轮比较:
left_max(0) < right_max(1),处理左指针- 当前柱子高度
height[0] = 0,可以接水min(0,1)-0 = 0 left右移到1,更新left_max = max(0,1) = 1
-
第二轮比较:
left_max(1) == right_max(1),处理右指针- 当前柱子高度
height[9] = 1,可以接水min(1,1)-1 = 0 right左移到8,更新right_max = max(1,2) = 2
提示:在实际编码时,建议用纸笔跟踪这些变量的变化,能更直观理解算法逻辑。
2.2 关键代码实现
python复制def trap(height):
if not height:
return 0
lef
