leetcode42雨水

题目链接:https://leetcode.cn/problems/trapping-rain-water/description/?envType=study-plan-v2\&envId=top-100-liked

法一:前缀和

求能装多少水,即左右两边木板高度的最小值减去数组元素。左边木板高度即左区间最大高度,右边木板高度即右区间最大高度。第一个数组存储从最左边到第i个位置的最大高度(前缀最大值),第二个数组存储从最右边到第i的位置的最大高度(后缀最大值)。对于当前位置的前缀最大值 = max(前一个位置的前缀最大值,当前位置的最大高度)。每一个位置的前后缀数组里的值的最小值减去数组中的数值即水

cpp 复制代码
class Solution {
    int pre_max[20010];
    int suf_max[20010];
public:
    int trap(vector<int>& nums) {
        int n = nums.size();
        pre_max[0] = nums[0];
        for (int i = 1; i < n; ++i)
            pre_max[i] = max(pre_max[i - 1], nums[i]);
        
        suf_max[n - 1] = nums[n - 1];
        for (int i = n - 2; i >= 0; --i)
            suf_max[i] = max(suf_max[i + 1], nums[i]);
        
        int ret = 0;
        for (int i = 0; i < n; ++i)
        {
            ret += min(pre_max[i], suf_max[i]) - nums[i];
        }
        return ret;

        
    }
};

法二:优化为双指针(好处,不用创建数组)

前缀最大值 > 后缀最大值,则最大高度为后缀最大值,水量为这个最大高度减去数组元素,右指针左移

cpp 复制代码
class Solution {
public:
    int trap(vector<int>& nums) {
        int n = nums.size();
        int pre_max = 0, suf_max = 0;
        int left = 0, right = n  - 1;
        int ret = 0;

        while (left <= right)
        {
            pre_max = max(pre_max, nums[left]);
            suf_max = max(suf_max, nums[right]);

            if (pre_max < suf_max)
            {
                ret += pre_max - nums[left++];
            }
            else ret += suf_max - nums[right--];
        }
        return ret;
    }
};
相关推荐
阳明山水30 分钟前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
桐盛科技1 小时前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算
Tongzhi20261 小时前
通芝科技考勤软件三大发展趋势:AI大模型、无感识别与数据底座
大数据·科技·算法·爬山算法
eBest数字化转型方案2 小时前
Route Optimization for FMCG:多目标排线算法的工程实现
大数据·人工智能·算法
residual_fan2 小时前
持续对比强化学习(Continual Contrastive Reinforcement Learning)论文分享
人工智能·算法·数据挖掘·数据分析
s_w.h2 小时前
【 计网 】序列化与反序列化
linux·服务器·网络·算法·bash
信奥卷王3 小时前
2025年09月GESPC++五级真题解析(含视频)
算法
白狐_7983 小时前
408 数据结构|外部排序:流程与 k 路归并
数据结构·算法
闻缺陷则喜何志丹3 小时前
【动态规划】P3609 [USACO17JAN] Hoof, Paper, Scissor G
c++·算法·动态规划·洛谷
leihefeng3 小时前
手写数字识别:KNN vs 逻辑回归实战
python·算法·机器学习·逻辑回归·scikit-learn