LeetCode 力扣 热题 100道(二十一)接雨水(C++)

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

代码如下所示:

cpp 复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        int n = height.size();
        if (n == 0) return 0;

        int left = 0, right = n - 1;
        int left_max = 0, right_max = 0;
        int water = 0;

        while (left < right) {
            if (height[left] < height[right]) {
                if (height[left] >= left_max) {
                    left_max = height[left]; // 更新左侧最大高度
                } else {
                    water += left_max - height[left]; // 累加雨水
                }
                ++left; // 左指针右移
            } else {
                if (height[right] >= right_max) {
                    right_max = height[right]; // 更新右侧最大高度
                } else {
                    water += right_max - height[right]; // 累加雨水
                }
                --right; // 右指针左移
            }
        }

        return water;
    }
};

利用两个指针分别从数组的两端向中间遍历。

同时维护两个变量:

left_max:从左侧当前最大高度。

right_max:从右侧当前最大高度。

计算能接的雨水:

如果 height[left] 小于等于 height[right],则 left 所在位置的最大雨水由 left_max - height[left] 决定,更新左指针。

如果 height[right] 小于 height[left],则 right 所在位置的最大雨水由 right_max - height[right] 决定,更新右指针。

继续移动指针,直到 left == right

相关推荐
青衫码上行3 分钟前
【Java Web学习 | 第12篇】JavaScript(6)DOM
java·开发语言·前端·javascript·学习
njxiejing6 分钟前
Python pandas基础:Series数据操作详解
数据结构·pandas
弘毅 失败的 mian8 分钟前
C++、Java 还是测试开发?
java·c++·经验分享·笔记·测试开发·技术方向·就业
杜子不疼.11 分钟前
【C++】 set/multiset底层原理与逻辑详解
java·开发语言·c++
Macbethad17 分钟前
如何用WPF做工控设置界面
java·开发语言·wpf
玖笙&21 分钟前
✨WPF编程进阶【7.2】:动画类型(附源码)
c++·c#·wpf·visual studio
汗流浃背了吧,老弟!27 分钟前
中文分词全切分算法
算法·中文分词·easyui
~~李木子~~32 分钟前
贪心算法实验1
算法·ios·贪心算法
大炮走火39 分钟前
iOS在制作framework时,oc与swift混编的流程及坑点!
开发语言·ios·swift
她说彩礼65万42 分钟前
C# 容器实例生命周期
开发语言·c#