找回密码
 立即注册
查看: 20|回复: 0

力扣面试17.21题解:接雨水问题的双指针**解

[复制链接]
  • 打卡等级:即来则安
  • 打卡总天数:17
  • 打卡月天数:1
  • 打卡总奖励:185
  • 最近打卡:2025-08-06 09:29:10

21

主题

8

回帖

1万

积分

VIP

积分
10208
发表于 2025-7-22 10:48:03 | 显示全部楼层 |阅读模式
截图未命名.jpg
一、问题描述
给定n个非负整数表示每个宽度为1的柱子的高度,计算按此排列的柱子,下雨之后能接多少雨水。
二、算法核心思想
本解决方案采用双指针法
  • 使用左右指针从两端向中间移动
  • 维护左右两边的**值
  • 根据较小的一边计算当前能接的雨水量
  • 移动较小值的指针继续计算

三、完整代码实现(带详细注释)
  1. #include <vector>
  2. #include <algorithm>
  3. using namespace std;

  4. class Solution {
  5. public:
  6.     int trap(vector<int>& height) {
  7.         if (height.empty()) return 0;  // 空数组直接返回0
  8.         
  9.         int left = 0, right = height.size() - 1;  // 初始化左右指针
  10.         int left_max = 0, right_max = 0;  // 初始化左右**值
  11.         int water = 0;  // 初始化雨水总量
  12.         
  13.         while (left < right) {
  14.             // 更新左右**值
  15.             left_max = max(left_max, height[left]);
  16.             right_max = max(right_max, height[right]);
  17.             
  18.             // 较小的一边决定当前能存的水量
  19.             if (height[left] < height[right]) {
  20.                 water += left_max - height[left];  // 计算左边能接的雨水
  21.                 left++;  // 移动左指针
  22.             } else {
  23.                 water += right_max - height[right];  // 计算右边能接的雨水
  24.                 right--;  // 移动右指针
  25.             }
  26.         }
  27.         
  28.         return water;  // 返回总雨水量
  29.     }
  30. };
复制代码


四、算法分步解析
  • 初始化阶段

    • 检查输入数组是否为空
    • 设置左右指针和**值变量
    • 初始化雨水总量为0

  • 双指针移动阶段

    • 更新左右两边的**值
    • 比较当前左右指针指向的高度
    • 根据较小的一边计算雨水量
    • 移动较小值对应的指针

  • 结果返回

    • 当左右指针相遇时结束循环
    • 返回累计的雨水总量

五、常见误区与调试技巧
  • 忘记处理空数组的特殊情况
  • 错误计算左右**值
  • 指针移动条件判断错误
  • 雨水量计算公式错误

来源:力扣面试17.21题解:接雨水问题的双指针**解

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

SEO网站 ( 冀ICP备2025113422号-2 )|网站地图

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表