当前位置: 首页 > article >正文

leetcode-42. 接雨水 单调栈

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

示例 1:

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105
// 接雨水问题解决方案类
class Solution {
public:
    /**
     * 计算给定高度图下雨后能接多少雨水
     * @param height 一系列非负整数表示的高度图
     * @return 返回能接的雨水总量
     */
    int trap(vector<int>& height) {
        // 总水量
        int sum = 0;
        // 高度图长度
        int len = height.size();
        // 使用栈来存储高度和对应索引
        stack<int> hv;
        stack<int> hi;
        // 初始化栈,将第一个高度和索引入栈
        hv.push(height[0]);
        hi.push(0);
        
        // 遍历高度图
        for(int i = 1; i < len; i++)
        {
            // 当前高度小于栈顶高度,直接入栈
            if(height[i]<hv.top())
            {
                hv.push(height[i]);
                hi.push(i);
            }
            // 当前高度等于栈顶高度,更新栈顶
            else if(height[i]==hv.top())
            {
                hv.pop();
                hi.pop();
                hv.push(height[i]);
                hi.push(i);
            }
            // 当前高度大于栈顶高度,开始结算水量
            else{
                // 当栈不为空且当前高度大于栈顶高度时,循环结算水量
                while(!hv.empty()&& height[i] > hv.top())
                {
                    // 弹出栈顶,计算被夹在中间的雨水
                    int mid =hi.top();
                    hi.pop();
                    hv.pop();
                    // 如果栈不为空,说明还有边界高度可以形成容器
                    if(!hv.empty())
                    {
                        // 计算容器的高度差
                        int h = min(hv.top(), height[i]) - height[mid];
                        // 计算容器的宽度
                        int w =i -hi.top()-1;
                        // 累加水量
                        sum +=h*w;
                    }
                }
                // 当前高度入栈
                hv.push(height[i]);
                hi.push(i);
            }
        }
        // 返回总水量
        return sum;
    }
};

 


http://www.kler.cn/news/342494.html

相关文章:

  • Netty写的Echo 服务器的例子
  • 美团Java一面
  • 【STM32单片机_(HAL库)】4-5-2【定时器TIM】【感应开关盖垃圾桶项目】HC-SR04超声波模块实验
  • 作为一名测试工程师如何学习Kubernetes(k8s)技能
  • Cherno游戏引擎笔记(61~72)
  • 四、Spring Boot集成Spring Security之认证流程
  • 鸿蒙NEXT开发-沉浸式导航和键盘避让模式(基于最新api12稳定版)
  • 音视频入门基础:FLV专题(14)——FFmpeg源码中,解码Script Tag的实现
  • Android常用C++特性之std::make_pair
  • 《动手学深度学习》Pytorch 版学习笔记一:从预备知识到现代卷积神经网络
  • 学习 JpGraph-历史曲线
  • 五种IO(输入/输出)模型
  • 微服务发展历程
  • 本地部署Docsify生成文档网站并实现公网环境远程访问
  • 机器学习与神经网络:从研究工具到诺贝尔物理学奖的突破
  • flutter鸿蒙版本通过底部导航栏的实现熟悉架构及语法
  • Docker 的数据管理
  • EdgeNAT: 高效边缘检测的 Transformer
  • MySQL(B站CodeWithMosh)——2024.10.10(13)
  • adum1201数字隔离器中文资料与应用