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

贾蔷
• 阅读 10

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

一、问题描述

给定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
  2. 双指针移动阶段
    • 更新左右两边的最大值
    • 比较当前左右指针指向的高度
    • 根据较小的一边计算雨水量
    • 移动较小值对应的指针
  3. 结果返回
    • 当左右指针相遇时结束循环
    • 返回累计的雨水总量

五、常见误区与调试技巧

  1. 忘记处理空数组的特殊情况
  2. 错误计算左右最大值
  3. 指针移动条件判断错误
  4. 雨水量计算公式错误

来源:力扣题解

点赞
收藏
评论区
推荐文章
BichonCode BichonCode
4年前
双指针问题
一、双指针之左右指针相关题目1.1题目要求:给定一个升序排列的整数数组,找到两个数,使它们的和等于给定的数,有且仅有一个满足条件的解,返回索引。题目分析:需要两个指针,一个指向开头,一个指向末尾,然后向中间遍历,如果指向的两个数相加正好等于target的话,直接返回两个指针的位置即可,若小于target,左指针右移一位,若大于target,右
DaLongggggg DaLongggggg
4年前
python-阶乘计算
问题描述  输入一个正整数n,输出n的值。  其中n123…n。算法描述  n可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A0表示a的个位,A1表示a的十位,依次类推。  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。  首先将a设为1,然后乘2,
DaLongggggg DaLongggggg
4年前
python刷题-数列排序
资源限制时间限制:1.0s内存限制:512.0MB问题描述  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<n<200输入格式  第一行为一个整数n。  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。输出格式  输出一行,按从小到大的顺序输出排序后的数列。样例输入583649样例输出34689···
DaLongggggg DaLongggggg
4年前
python刷题-数列特征
问题描述给出n个数,找出这n个数的最大值,最小值,和。输入格式第一行为整数n,表示数的个数。第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。输出格式输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。样例输入513245样例输出5211数据规模与约定1<n<10000。
Stella981 Stella981
3年前
LeetCode 84.柱状图中最大矩形的面积
给定_n_个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。!(https://img2018.cnblogs.com/blog/1735759/201907/1735759201907081935272741040149911.png)以上是柱状图的示例,其中
Stella981 Stella981
3年前
LeetCode 42. 接雨水
给定 _n_ 个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。!(https://oscimg.oschina.net/oscnet/b0cc4f8b9a129e159dc6141c019d5b3c043.png)上面是由数组\0,1,0,2,1,0,1,3,2,1,2,1\表示的高度图,在这种情况
贾蔷 贾蔷
1个月前
NOIP 2000 提高组 洛谷1004题(方格取数)解题思路与C++代码解析
一、题目描述简要描述题目:例如,在一个n×n的方格图中,每个格子包含一个正整数。需要选择两条从左上角到右下角的路径,路径可重复经过格子,但两条路径除起点和终点外不能相交。求两条路径数字和的最大值。二、解题思路与算法分析1.问题分析1.问题核心是求解两条不交
贾蔷 贾蔷
2星期前
牛客3750题滑动窗口最大值解析:双端队列优化解法与代码详解
一、题目解读要求在一个给定的整数中,计算固定大小为k的内元素的最大值。例如,当窗口滑动时,需要实时输出每个窗口中的最大值序列。该问题考察对的理解,以及如何高效维护窗口内的元素关系。二、解题思路采用(deque)维护的巧妙解法。核心思想是:中仅存储数组下标,
贾蔷 贾蔷
3天前
【动态规划入门】力扣509题:斐波那契数列的经典解法与优化思路
一、题目解读‌是一个经典的数学问题,在计算机科学中常被用作教学的入门案例。这个神奇的数列从0和1开始,后续每个数字都是前两个数字之和。题目要求我们计算第n个,看似简单的问题背后却蕴含着重要的算法思想。当n较小时,这个问题似乎微不足道,但随着n的增大,不同的
深度学习 深度学习
10小时前
LeetCode 2576题解:双指针法求解最多标记下标(排序+贪心策略)
一、题目解读2576题要求在一个整数中寻找最多可标记的下标对:若nums法”的组合思路:1.排序预处理:对原数组nums进行升序排序,确保相同元素聚集,便于后续配对。2.双划分:将排序后的数组分为左右两半(左指针left0,右指针rightn/2),从