力扣之接雨水(42)

刷题不在多,而在精。

这道题号称字节的保洁阿姨都能做出的。

方法一:动态规划

下面这幅图简直封神,看了下图我才做出来的。

 两个方向遍历,然后取相同覆盖值-原始值(heigth数组)

这种方法更好理解。但是也有点难想出来。   可以想象吹风,被墙挡住了后面的沙子也和山那么高

从两头吹,然后能留下来的减去 里面坚硬的石头就是能装沙子的总容量了

 public static int trap(int[] height) {

        int []left=new int[height.length];
        int []right=new int[height.length];
        int left_max=0;
        int right_max=0;
        int n=height.length;
        for (int i = 0; i <n ; i++) {
            //从左向右遍历
            left_max=Math.max(height[i],left_max);
            left[i]=left_max;

            //从右向左
            right_max=Math.max(height[n-1-i],right_max);
            right[n-i-1]=right_max;

        }

        int result=0;
        for(int i=0;i<n;i++){
            int t=Math.min(left[i],right[i]);
            result+=t-height[i];
        }
        return result;
    }

方法二:双指针法

我对这种方法有点印象,但是还是忘了具体的做法。二刷之后茅塞顿开。

这种方法比方法一更难理解,但是更高效,时间复杂度来到了O(1)

维护两个指针 left 和 right,以及两个变量 leftMax 和 rightMax,初始时 left=0,right=n−1,leftMax=0,rightMax=0。指针 left 只会向右移动,指针 right 只会向左移动,在移动指针的过程中维护两个变量 leftMax 和 rightMax 的值。

当两个指针没有相遇时,进行如下操作:

使用 height[left] 和 height[right] 的值更新 leftMax 和 rightMax 的值;

如果 height[left]<height[right],并且height[left]<leftMax,下标 left 处能接的雨水量等于 leftMax−height[left],将下标 left 处能接的雨水量加到能接的雨水总量,然后将 left 加 1(即向右移动一位);

如果 height[left]≥height[right],并且height[right]<rightMax,下标 right 处能接的雨水量等于 rightMax−height[right],将下标 right 处能接的雨水量加到能接的雨水总量,然后将 right 减 1(即向左移动一位)。

当两个指针相遇时,即可得到能接的雨水总量。

想象一下,你是左指针,右边的那位比你高,而你不是左边最高的,你后面还有大山,是不是一下雨你就一定能乘到水。即使你和你左边的一样高,那顶多乘水为0嘛。如果你比左边的还高的话,你这个位置就乘不到水了。

public static int trap(int[] height) {
        int left_max=0,right_max=0;
        int left=0,right=height.length-1;
        int result=0;//总共装水量
        while(left!=right){

            if(height[left]<height[right]){
                //如果左边小于右边,如果左边的值 <左最大值 证明可以装水
                if(height[left]<left_max){
                    result+=left_max-height[left];
                }else{
                    left_max=height[left];
                }
                left++;
            }else{
                //如果左边大于右边,如果右边的值 <右最大值 证明可以装水
                if(height[right]<right_max){
                    result+=right_max-height[right];
                }else{
                    right_max=height[right];
                }
                right--;
            }
        }
        return result;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/891951.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

厨房老鼠数据集:掀起餐饮卫生监测的科技浪潮

厨房老鼠数据集&#xff1a;掀起餐饮卫生监测的科技浪潮 摘要&#xff1a;本文深入探讨了厨房老鼠数据集在餐饮行业卫生管理中的重要性及其相关技术应用。厨房老鼠数据集通过收集夜间厨房图像、老鼠标注信息以及环境数据&#xff0c;为深度学习模型提供了丰富的训练样本。基于…

新手爬虫DAY1

这个错误信息表明在你的Python程序中&#xff0c;re.search() 函数没有找到预期的匹配项&#xff0c;因此返回了 None。当你尝试在 None 对象上调用 group(1) 方法时&#xff0c;Python 抛出了一个 AttributeError。 具体来说&#xff0c;错误发生在 pc.py 文件的第6行&#x…

QT开发--QT基础

第0章 QT工具介绍 0.1 编译工具 uic&#xff0c;rcc&#xff0c;moc&#xff0c;qmake 都是 qt 的工具 uic 主要是 编译 .ui文件 -> ui_xxx.h //.ui文件 .h rcc 主要是 编译 资源文件.qrc文件 -> xxx.rcc …

某电子元器件企业人力资源管理体系搭建咨询项目

某电子元器件企业人力资源管理体系搭建咨询项目 ——搭建管理体系&#xff0c;梳理工作流程 【导读】 与其他同类企业一样&#xff0c;该电子公司面临招不到合适的人才、留不住人才的难题&#xff0c;自然也加大了人力资源管理的成本。公司人事部员工的工作基本上陷入了“招…

OpenUAV:首个专为现实无人机视觉语言导航设计的大规模轨迹数据集,由大约 12k 个轨迹组成,涵盖了多种环境和复杂的飞行动态。

2024-10-10&#xff0c;由北京航空航天大学人工智能研究所、香港中文大学MMLab以及感知与交互智能中心共同创建了OpenUAV数据集&#xff0c;首个专为现实无人机&#xff08;UAV&#xff09;视觉语言导航&#xff08;VLN&#xff09;任务设计的大型轨迹数据集&#xff0c;该数据…

波司登超1000+门店用钉钉Teambition开店管理,实现拓店“自动化”

门店开在哪里&#xff1f;什么时候装修&#xff1f;什么时候开门迎客&#xff1f; 在瞬息万变的零售行业&#xff0c;门店作为连接产品和消费者、融合线上和线下的核心场景&#xff0c;其运营效率和管理策略至关重要。 近日&#xff0c;波司登正式启用钉钉项目 Teambition&am…

【uniapp】打包成H5并发布

目录 1、设置配置mainifest.sjon 1.1 页面标题 1.2 路由模式 1.3 运行的基础路径 2、打包 2.1 打包入口 2.2 打包成功 2.3 依据目录找到web目录 3、 将web目录整体拷贝出来 4、上传 4.1 登录uniapp官网注册免费空间 4.2 上传拷贝的目录 4.3 检查上传是否正确 5、…

内容共创与UGC:TikTok腰部达人推动品牌海外传播新风向

当今数字营销的新时代&#xff0c;内容共创已成为品牌与用户之间构建深度互动的关键方式。在TikTok上&#xff0c;腰部达人通过UGC等形式&#xff0c;不仅能增强品牌与用户的互动性和参与度&#xff0c;还能够帮助品牌在海外市场上实现声量和知名度的提升。本文Nox聚星将和大家…

嵌入式开发学习日记——认识指针及和数组函数的联系(c语言)

一、指针的定义 一般格式&#xff1a; 数据类型 * 指针变量名 [初始地址值]; 数据类型是指针所指向的地址处的数据类型&#xff0c;如 int、char、float 等。 符号 * 用于通知系统&#xff0c;这里定义的是一个指针变量&#xff0c;通常跟在类型关键字的后面&#xff0c;表示…

从入门到高手的99个Python案例

想掌握Python编程语言&#xff0c;从零基础的小白晋升为大神&#xff1f;没问题&#xff01;接下来我们将以轻松有趣的方式&#xff0c;逐一解锁Python学习路上的99个关键知识点。每一步都将结合实际应用场景、函数功能解析及简洁代码演示&#xff0c;带你深度领略Python的魅力…

为什么火箭回收技术如此重要?——以马斯克的星舰为例

引言 随着人类对太空探索的深入&#xff0c;火箭技术成为了人类通往星辰大海的关键工具。在这个领域&#xff0c;SpaceX 的火箭回收技术近年来取得了重要突破&#xff0c;尤其是其 “筷子夹火箭” 的设计进一步引发了广泛讨论。2024年10月13日&#xff0c;马斯克的第五次星舰试…

Flink窗口分配器WindowAssigner

前言 Flink 数据流经过 keyBy 分组后&#xff0c;下一步就是 WindowAssigner。 WindowAssigner 定义了 stream 中的元素如何被分发到各个窗口&#xff0c;元素可以被分发到一个或多个窗口中&#xff0c;Flink 内置了常用的窗口分配器&#xff0c;包括&#xff1a;tumbling wi…

而今再看unet

从最开始听到人用Unet左inpainting&#xff0c;再到自己使用Unet做图像去噪任务&#xff0c;虽然没有用Unet做过分割&#xff0c;但Unet也可以称得上是老朋友了。现在回头再看Unet&#xff0c;温故知新&#xff0c;一些魔鬼真就藏在一些细节之中。 structure 结构由forward函数…

【C++】:工厂模式

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 简单工厂模什么是简单工厂模式&#xff1f;如何实现简单工厂模式&#xff1f; 工厂方法抽象工厂模式总结简单工厂模式工厂方法抽象工厂「Abstract Factory」 简单工厂模 什么是简单工厂模式&#xf…

【计算机网络】详解数据链路层数据帧Mac地址ARP协议

一、以太网帧 "以太网" 不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容 。例如&#xff1a;规定了网络拓扑结构&#xff0c;访问控制方式&#xff0c;传输速率等&#xff1b;例如以太网中…

【智能算法应用】引力搜索算法求解二维路径规划问题

摘要 引力搜索算法&#xff08;GSA&#xff09;是一种基于引力学说的启发式算法&#xff0c;用于解决复杂的优化问题。本文应用 GSA 于二维路径规划问题&#xff0c;通过优化路径来避开障碍物并达到目标点。实验结果表明&#xff0c;GSA 在路径规划中具有良好的表现&#xff0…

课程作业管理系统的设计与实现(论文+源码)_kaic

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法…

基于Docker安装Grafana及其基本功能

Grafana是一款用Go语言开发的开源数据可视化工具&#xff0c;可以做数据监控和数据统计&#xff0c;带有告警功能。 拉取Grafana镜像 docker pull grafana/grafana 运行镜像 docker run -d -p 3000:3000 --namegrafana grafana/grafana 打开浏览器&#xff0c;访问 http://l…

|动漫爬取|001_djangodjango基于Spark的国漫推荐系统的设计与实现2024_tpd6q1o4

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

to_sql报错not all arguments converted during string formatting

报错&#xff1a; DatabaseError: Execution failed on sql SELECT name FROM sqlite_master WHERE typetable AND name?;: not all arguments converted during string formattingb 报错的代码如下&#xff1a; import pymysql import pandas as pd con pymysql.connect(…