leetcode hot 100 接雨水。我自己ac的比较一般的方法,200ms

cpp 复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        int sum = 0;
        int i = 0;
        int n = height.size();
        if (n == 0 || n == 1) return 0;
        while (i < n && height[i] == 0) i ++ ;
        for (int j = i + 1; j < n; j ++ ) {
            while (j < n && height[i] <= height[j]) i = j ++ ;
            if (j == n) return sum;
            int r = j + 1;
            while (r < n && height[r] < height[i]) r ++ ;
            if (r == n) {
                //右边都比i处小,分两种情况,一种右边一直变小,一种右边有最大值,就找最大值
                //求最值,如果最值等于j处值,则i ++ 
                r = j;
                while(r < n - 1 && height[r + 1] <= height[r]) r ++ ;
                if (r >= n - 1) {//说明一直递减,右边没有凹陷了
                    return sum;
                }
                else {//此时r + 1处大于r处,也就是有凹陷,就要求右边的最大值
                    j = r;
                    int h = - 2e9;
                    for (; r < n; r ++ ) {
                        if (height[r] > h) {
                            j = r;
                            h = height[r];
                        }
                    }//这样就找到最大值和最大值所在的地方了,并且所找到的最大值就是h,接下来要找i的位置
                    while (i < j && height[i + 1] > height[j]) i ++ ;
                    for (i = i + 1; i < j; i ++ ) sum += h - height[i];

                }
            }
            else {
                //右边存在比i处大
                j = r;
                int h = min(height[i], height[j]);
                for (i = i + 1; i < j; i ++ ) sum += h - height[i];
            }
        }
        return sum;
    }
};

思路就是设置两个指针l和r,两个指针分别从左指到右,最后会遍历完整个height,

把接雨水看做求凹陷处的过程。

凹陷处才有雨水。

l就是凹陷处左边,r就是凹陷处右边

当l+1处小于l时,说明l右边在下坡,那我们只要找到上坡就有凹陷。

可以分情况讨论,

1.右边存在高于l的,一定有凹陷,可以直接找到第一个高于l的处赋值给r,然后水面的高度就是l处的高度,然后计算水的含量

2.右边都低于l处,那又只有两种情况,

2.1右边不存在上坡,则后面不存在凹陷了,可以直接返回前面得到的sum

2.2右边存在上坡,则后面一定有凹陷,因为右边都比l处低,所以右边的第一个最高处,就是水坑的r,右边的这个最高处的高度就是接下来水坑里水的高度,又因为l处此时可能并不是水坑的左边界,我们就进行比较,找到最后一个高于水坑高度的l,就是左边界,然后计算水的含量

相关推荐
MarkHD8 分钟前
智能体在车联网中的应用:第31天 基于RLlib的多智能体PPO实战:MAPPO算法解决simple_spread合作任务
算法
IT猿手10 分钟前
三维动态避障路径规划:基于部落竞争与成员合作算法(CTCM)融合动态窗口法DWA的无人机三维动态避障方法研究,MATLAB代码
算法·matlab·动态规划·无人机·路径规划·动态路径规划
wadesir28 分钟前
Java实现遗传算法(从零开始掌握智能优化算法)
java·开发语言·算法
Jeremy爱编码31 分钟前
leetcode热题腐烂的橘子
算法·leetcode·职场和发展
H CHY43 分钟前
C++代码
c语言·开发语言·数据结构·c++·算法·青少年编程
alphaTao44 分钟前
LeetCode 每日一题 2025/12/22-2025/12/28
算法·leetcode
xiaolang_8616_wjl1 小时前
c++题目_传桶(改编于atcoder(题目:Heavy Buckets))
数据结构·c++·算法
中國龍在廣州1 小时前
生成不遗忘,「超长时序」世界模型,北大EgoLCD长短时记忆加持
人工智能·深度学习·算法·自然语言处理·chatgpt
亓才孓1 小时前
java中的Math.Radom拓展
开发语言·python·算法
霍田煜熙1 小时前
CBMS最新源码
算法