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,就是左边界,然后计算水的含量

相关推荐
wabs66611 分钟前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
CIO_Alliance18 分钟前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型
m0_547486662 小时前
《数据结构与算法》全套PPT课件2026(中国海洋大学)
数据结构·算法
旖旎夜光2 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
怪奇云呼军2 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
乐观勇敢坚强的老彭4 小时前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
高洁014 小时前
工信部教考中心证书
人工智能·深度学习·算法·机器学习·知识图谱
我变成萤火虫4 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
Dr.kangder4 小时前
嵌入式面试总结(十九)——内存泄露
单片机·算法·面试·职场和发展·架构·硬件架构
Herbert_hwt4 小时前
【C语言基础】常量、选择结构与运算符全解析
c语言·开发语言·算法