双指针 --- 接雨水

🔥个人主页: Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

这是一道经典的困难级别题目,核心在于理解每个位置能承接的雨水量,是由它左右两侧的最高柱子中较矮的那根决定的。

双指针解法思路

核心原理

对于任意位置 i,能接的雨水量 = min(左侧最高高度, 右侧最高高度) - height[i]。如果该值为负,则说明无法接水,记为 0。

双指针优化

我们不需要提前计算左右两侧的最高高度数组(这会占用 O (n) 空间),可以用双指针在一次遍历中完成计算:

  • 用 left 和 right 两个指针分别从数组两端向中间移动
  • 维护 pleft 和 pright 两个变量,分别记录左指针左侧的最高高度和右指针右侧的最高高度
  • 每次比较 pleft 和 pright,选择较小的一侧进行计算:
    • 如果 pleft < pright,说明左指针位置的雨水量由 pleft 决定,计算后左指针右移
    • 否则,说明右指针位置的雨水量由 pright 决定,计算后右指针左移

完整代码

cpp

复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        int pleft = 0, pright = 0;
        int left = 0;
        int sum = 0;
        int right = height.size() - 1;
        while (left < right) {
            pleft = max(pleft, height[left]);
            pright = max(pright, height[right]);
            sum += pleft < pright ? (pleft - height[left++]) : (pright - height[right--]);
        }
        return sum;
    }
};

代码解析

  1. 初始化:

    • left 指针从数组头部开始,right 指针从数组尾部开始
    • pleft 和 pright 初始化为 0,分别记录左右两侧的最大高度
    • sum 用于累计总雨水量
  2. 双指针移动:

    • 每次更新当前指针位置的最大高度
    • 比较 pleft 和 pright,确定当前能计算的指针
    • 计算当前指针位置的雨水量并累加到 sum
    • 移动对应的指针(左指针右移或右指针左移)
  3. 终止条件 :当 left >= right 时,遍历结束,返回 sum

复杂度分析

  • 时间复杂度:O (n),每个元素最多被访问一次
  • 空间复杂度:O (1),只使用了常数级别的额外空间

示例验证

以示例 1 输入 height = [0,1,0,2,1,0,1,3,2,1,2,1] 为例:

  • 初始时 left=0,right=11
  • 随着指针移动,pleft 和 pright 不断更新
  • 最终累计 sum=6,与题目输出一致
相关推荐
代码山河4 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行4 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
学长毕设4 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
梯度下降者5 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
zzu123zsw6 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
Yuzhiyuxia6 小时前
【AI Agent面试系列】AI Agent记忆机制知识点1
人工智能·面试·职场和发展
UIU1146 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
“AI国潮设计-小江”6 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
源码集结号6 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场7 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算