双指针巧解LeetCode接雨水难题

LeetCode 42 题「接雨水」是数组类难题的经典代表,考察对动态规划 / 双指针 的理解。本文将拆解双指针法的核心思路,并给出简洁高效的代码实现。

一、题目理解

给定 n 个非负整数表示 "宽度为 1 的柱子高度",计算这些柱子排列后能接住的雨水量。

  • 示例:输入[0,1,0,2,1,0,1,3,2,1,2,1],输出6(蓝色区域为雨水)。

二、核心思路:双指针法(O (n) 时间 + O (1) 空间)

接雨水的本质是:每个位置能接的雨水量 = 该位置左右两侧的 "最高柱子高度的较小值" - 自身高度

双指针法通过左右指针向中间收缩,避免了动态规划的额外空间开销,核心逻辑如下:

  1. 定义left(左指针,初始 0)、right(右指针,初始数组末尾);
  2. 定义pleft(左指针左侧的最高高度)、pright(右指针右侧的最高高度);
  3. 比较pleftpright
    • pleft < pright:左指针位置的接水量由pleft决定(右侧有更高的柱子兜底),计算当前位置接水量后左指针右移;
    • pleft >= pright:右指针位置的接水量由pright决定(左侧有更高的柱子兜底),计算当前位置接水量后右指针左移;
  4. 每次移动指针时,更新对应的 "最高高度"。

三、代码实现(C++)

cpp

复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        if (height.empty()) return 0; // 空数组直接返回0
        int pleft = 0, pright = 0;    // 左右侧的最高高度
        int left = 0;                 // 左指针
        int right = height.size() - 1;// 右指针
        int sum = 0;                  // 总接水量
        
        while (left < right) {
            // 更新左侧最高高度
            pleft = max(pleft, height[left]);
            // 更新右侧最高高度
            pright = max(pright, height[right]);
            
            // 计算当前位置接水量,并移动指针
            if (pleft < pright) {
                sum += pleft - height[left];
                left++;
            } else {
                sum += pright - height[right];
                right--;
            }
        }
        return sum;
    }
};

四、代码解析

  • 初始条件:空数组直接返回 0,避免边界错误;
  • 指针移动逻辑:始终让 "较矮的一侧指针" 移动,保证当前计算的接水量是有效的(因为另一侧有更高的柱子能接住水);
  • 空间优化:仅用常数级变量存储状态,相比动态规划的 O (n) 空间,双指针法空间复杂度为 O (1)。

五、复杂度分析

  • 时间复杂度:O (n)(仅遍历数组一次);
  • 空间复杂度:O (1)(无额外数组开销)。

双指针法是「接雨水」的最优解法之一,既高效又简洁,核心是抓住 "接水量由两侧较矮的最高柱决定" 这一规律。

相关推荐
玄同7652 小时前
Python 流程控制:LLM 批量推理与 API 限流处理
服务器·人工智能·python·深度学习·自然语言处理·数据挖掘·知识图谱
qualifying2 小时前
JAVAEE——多线程(2)
java·开发语言
乾元2 小时前
生成对抗样本在网络安全中的工程化解读——AI 误报、误判与对抗的真实边界
运维·网络·人工智能·python·安全·web安全
ALex_zry2 小时前
C++ 中多继承与虚函数表的内存布局解析
java·开发语言·c++
杰瑞不懂代码2 小时前
基于 MATLAB 的 AM/DSB-SC/VSB 模拟调制与解调仿真及性能对比研究
开发语言·matlab·语音识别·am·dsb-sc·vsb
w-w0w-w2 小时前
C++构造函数与析构函数详解
c++
霁月的小屋2 小时前
从Vue3与Vite的区别切入:详解Props校验与组件实例
开发语言·前端·javascript·vue.js
IT·小灰灰2 小时前
零成本解锁国产双旗舰:在AI Ping平台免费体验MiniMax M2.1与GLM-4.7的完整实战指南
人工智能·python
程序媛徐师姐2 小时前
Python基于人脸识别的医院重点区域管理系统【附源码、文档说明】
python·人脸识别·python人脸识别·python医院重点区域管理·人脸识别的医院重点区域管理系统·pytho医院重点管理系统·医院重点区域管理系统