LeetCode Hot100 之 19 接雨水

题目

思路

看了很久没思路,直接参考了网上的题解。

思路大概就是维护一个单调栈,其中存储的是每个块的下标,当有一个没找到比他更高的右边块时将其入栈(只要是没有更高的右方块就入栈,所以栈中会存放不止一个块,其中高度是非递增的),直到有一个更高的右方块出现,就把当前栈顶出栈,作为坑底,将当前栈顶(已经出栈的坑底的左边一个块)作为左边界,左右边界的更低者减去坑底高度为存储水位,宽度为右边界减去左边界,水量就是水位*宽度。

注意这样算的话是按每一层横向来算的。

代码

cpp 复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        stack<int> st; // 存数组下标的单调栈(从底到顶高度单调递减)
        int total_water = 0;
        
        for (int i = 0; i < height.size(); i++) {
            // 当前柱子如果比栈顶柱子高,说明找到了栈顶柱子的"右边界高墙"
            while (!st.empty() && height[i] > height[st.top()]) {
                int bottom_index = st.top(); // 获取坑底的下标
                st.pop(); // 坑底出栈
                
                // 如果栈空了,说明左边没有高墙了,像是一个左边漏水的悬崖,接不住水,直接退出循环
                if (st.empty()) {
                    break;
                }
                
                // 此时新的栈顶就是坑底左边的高墙
                int left_index = st.top();
                int right_index = i;
                
                // 积水的宽度
                int w = right_index - left_index - 1;
                // 积水的高度 = 左右两墙的较矮者 - 坑底的高度
                int h = min(height[left_index], height[right_index]) - height[bottom_index];
                
                // 累加这一个横向层面的雨水量
                total_water += w * h;
            }
            // 当前柱子入栈,等待后面比它高的柱子来和它形成凹槽
            st.push(i);
        }
        
        return total_water;
    }
};

结果

相关推荐
u01110267528 分钟前
图片预览越来越占内存聊聊 URL.createObjectURL 的释放时机
图像处理·深度学习·算法·ai作画
Zane199428 分钟前
同样是遍历图,为什么BFS能保证找到最短路径,DFS却不行
算法
无限码力29 分钟前
2026华为OD机试真题 新系统 9月27日【坚果巧克力】
算法·华为od·华为od机考·华为od机试真题·华为od机试·华为od机考真题题解·华为社招笔试真题
samforce33 分钟前
叹息之墙——人类认知 AI,终将遇到的一堵同构之墙
人工智能·深度学习·算法·哲学·认知科学
l1t44 分钟前
编译测试兼容gzip并行压缩解压工具pigz
c++·算法
代码不停1 小时前
BFS算法解决FloodFill问题
算法·bfs·宽度优先
纪念 2291 小时前
C++算法(一)
开发语言·c++·算法
All for pursuit.2 小时前
【二叉树-10】114.二叉树展开为链表
数据结构·c++·算法·leetcode·链表
叠层归一研究院2 小时前
区分预算与通道诱导:Ω–L叠层体系的观测赋值与定量验证
人工智能·算法
BYSJMG2 小时前
计算机毕业设计选题推荐:基于大数据的快递物流运营数据分析与可视化,Spark与K-Means
大数据·算法·数据分析·spark·课程设计