力扣接雨水问题解析:双指针与动态规划实战

发布时间:2026/10/27 22:36:16
力扣接雨水问题解析:双指针与动态规划实战 1. 项目概述接雨水是力扣HOT100系列中的一道经典算法题编号T.42考察对数组处理、动态规划和双指针等核心算法思想的掌握。这道题要求计算给定高度数组能接住多少雨水是面试中高频出现的题目类型。我在刷题过程中发现这道题主要有两种主流解法辅助数组法和双指针法。前者思路直观但空间复杂度较高后者则需要更巧妙的指针操作但能实现O(1)空间复杂度。本文将详细拆解这两种解法的实现逻辑并分享我在力扣打卡过程中的调试心得和优化技巧。2. 核心算法解析2.1 问题建模与暴力解法给定n个非负整数表示的高度图计算按此排列的柱子能接住多少雨水。示例输入[0,1,0,2,1,0,1,3,2,1,2,1]输出6。暴力解法的思路是对于每个位置i找到其左边最高柱子left_max和右边最高柱子right_max该位置接水量为min(left_max, right_max) - height[i]。时间复杂度O(n²)显然不适用于大规模数据。# 暴力解法伪代码 result 0 for i in range(n): left_max max(height[:i1]) right_max max(height[i:]) result min(left_max, right_max) - height[i]2.2 辅助数组法优化通过预处理两个辅助数组可以避免重复计算left_max[i]记录位置i左侧含i的最大高度right_max[i]记录位置i右侧含i的最大高度def trap(height): if not height: return 0 n len(height) left_max [0] * n right_max [0] * n left_max[0] height[0] for i in range(1, n): left_max[i] max(left_max[i-1], height[i]) right_max[-1] height[-1] for i in range(n-2, -1, -1): right_max[i] max(right_max[i1], height[i]) res 0 for i in range(n): res min(left_max[i], right_max[i]) - height[i] return res注意事项边界条件处理很重要。当height为空时直接返回0且辅助数组的初始化需要包含首尾元素。2.3 双指针法进阶双指针法通过动态维护左右两端的最大值将空间复杂度优化到O(1)def trap(height): if not height: return 0 left, right 0, len(height)-1 left_max right_max res 0 while left right: if height[left] height[right]: if height[left] left_max: left_max height[left] else: res left_max - height[left] left 1 else: if height[right] right_max: right_max height[right] else: res right_max - height[right] right - 1 return res关键点在于左右指针从两端向中间移动每次移动较矮一侧的指针因为接水量由较矮的一侧决定动态更新左右最大值并计算当前列的接水量3. 算法对比与选择方法时间复杂度空间复杂度适用场景暴力解法O(n²)O(1)仅用于理解问题本质辅助数组法O(n)O(n)面试首选思路最直观双指针法O(n)O(1)要求优化空间复杂度时用实际面试中建议先阐述辅助数组法再优化到双指针法。我在力扣提交记录显示双指针法运行时间通常比辅助数组法快10-15%内存消耗减少约50%。4. 调试与优化实录4.1 常见错误排查数组越界忘记处理空数组情况导致index error# 错误示例 left_max[0] height[0] # 当height[]时崩溃逻辑错误混淆左右最大值的更新时机# 错误示例双指针法 if height[left] left_max: res left_max - height[left] # 应该在else分支边界遗漏未考虑首尾柱子不能接水的特性4.2 性能优化技巧提前终止当left_max height[right]时右侧不需要再计算while left right and left_max height[right]: left_max max(left_max, height[left]) res left_max - height[left] left 1合并循环辅助数组法的两个预处理循环可以合并但会降低可读性使用内置函数max()比if判断稍快但差异不大5. 力扣刷题方法论这道题在HOT100中编号12/100属于数组与字符串类别。我的刷题策略是先独立思考15分钟尝试暴力解法查看题解学习最优解法手写实现并提交记录不同解法的时空复杂度制作错题本记录典型错误对于接雨水这类经典问题建议理解木桶效应的核心思想掌握从暴力解法到优化解法的演进过程熟练手写双指针法的代码模板我在实现过程中发现画图辅助理解非常有效。用柱状图标注左右最大值和接水区域能直观验证算法正确性。例如对于输入[4,2,0,3,2,5]可以这样可视化X X X X X X X X X X X通过这道题的练习我对双指针法的应用场景有了更深理解——当问题可以分解为左右两部分的相互作用时双指针往往是优化空间复杂度的利器。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询