为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
C++

https://img1.sycdn.imooc.com/6792ca68087efb4209360636.jpg

一、问题描述

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

二、算法核心思想

本解决方案采用双指针法

  1. 使用左右指针从两端向中间移动

  2. 维护左右两边的最大值

  3. 根据较小的一边计算当前能接的雨水量

  4. 移动较小值的指针继续计算

三、完整代码实现(带详细注释)

#include <vector>#include <algorithm>using namespace std;class Solution {public:
    int trap(vector<int>& height) {
        if (height.empty()) return 0;  // 空数组直接返回0
        
        int left = 0, right = height.size() - 1;  // 初始化左右指针
        int left_max = 0, right_max = 0;  // 初始化左右最大值
        int water = 0;  // 初始化雨水总量
        
        while (left < right) {
            // 更新左右最大值
            left_max = max(left_max, height[left]);
            right_max = max(right_max, height[right]);
            
            // 较小的一边决定当前能存的水量
            if (height[left] < height[right]) {
                water += left_max - height[left];  // 计算左边能接的雨水
                left++;  // 移动左指针
            } else {
                water += right_max - height[right];  // 计算右边能接的雨水
                right--;  // 移动右指针
            }
        }
        
        return water;  // 返回总雨水量
    }};

四、算法分步解析

  1. 初始化阶段

  • 检查输入数组是否为空

  • 设置左右指针和最大值变量

  • 初始化雨水总量为0

双指针移动阶段

  • 更新左右两边的最大值

  • 比较当前左右指针指向的高度

  • 根据较小的一边计算雨水量

  • 移动较小值对应的指针

结果返回

  • 当左右指针相遇时结束循环

  • 返回累计的雨水总量

五、常见误区与调试技巧

  1. 忘记处理空数组的特殊情况

  2. 错误计算左右最大值

  3. 指针移动条件判断错误

  4. 雨水量计算公式错误

来源:力扣题解



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消