ad1 广告
 
收藏文章 楼主

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

版块:文章资讯   类型:普通   作者:某个人   查看:15   回复:0   获赞:0   时间:2025-07-22 10:47:20

截图未命名.jpg 力扣面试17.21题解:接雨水问题的双指针最优解 双指针法 力扣面试题 动态规划 力扣题解 第1张

一、问题描述

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

二、算法核心思想

本解决方案采用双指针法

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

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

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

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

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

C++

#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

  2. 双指针移动阶段

    • 更新左右两边的最大值

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

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

    • 移动较小值对应的指针

  3. 结果返回

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

    • 返回累计的雨水总量

五、常见误区与调试技巧

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

  2. 错误计算左右最大值

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

  4. 雨水量计算公式错误

来源:力扣题解

 
ad1 广告位8,870 x auto
回复列表
默认   热门   正序   倒序

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

Powered by 免费外链论坛

©2015 - 2025 免费外链论坛

免费外链论坛 免费发布外链 发外链平台Sitemap

您的IP:216.73.216.202,2025-08-03 04:50:16,Processed in 0.02398 second(s).

备案信息:浙ICP备2024090696号

声明:本站内容为用户自主发布,不对其内容真实性负责,虽然本站会一一审核,但能力有限,如您发现违规内容,请及时联系管理员。

主页

欢迎您的浏览

QQ联系图标

自助查询

99%的问题都能找到答案

联系站长

工作时间:9:00~17:30

微信二维码

回到顶部

向上滚动到顶部

个人中心

去个人首页看看吧

转到底部

向下滚动到底部

头像

用户名:

粉丝数:

签名:

资料 关注 好友 消息