Leetcode面试经典150题-42.接雨水

news2024/9/21 5:41:20

解法都在代码里,不懂就留言或者私信

class Solution {
    /**本题的解题思路是双指针:一个从头开始一个从尾巴开始,两头的肯定是没有办法接住雨水的,你可以认为0位置左边是0的柱子
    所以理论上我们是从1遍历到n-2,但是你也可以遍历0到N-1,两种方式的不用我们设置的变量值也不同
    以我从1~n-2遍历来说,我先把lMax设置为heigh[0], rMax设置为height[height.lenght - 1]
    如果以0~N-1遍历来说,两个变量都设置为0
    遍历的过程中比较lMax和rMax的大小,lMax小结算左边,rMax小的话结算右边
    如果lMax和rMax相同则两个都结算,所以遍历过程中很可能出现每次计算两个的情况,比如[5,1,1,2,3,4,5]
    左边结算时用Math.max(0, lMax-height[left]),右边使用Math.max(0, rMax-height[right])
    这样结算的原理是就算只有两根柱子,我们要结算的柱子加上水也至少可以到达短的那个柱子的高度
    但是就算中间有更高的柱子,根据木桶原理,也确实只能放这么多
    */
    public int trap(int[] height) {
        /**空的或者只有两个及以下的柱子是放不了水的,因为我们认为边缘的柱子高度都是0 */
        if(height == null || height.length <= 2){
            return 0;
        }
        /**左边从1开始,右边从height.length-2开始 */
        int left = 1;
        int right = height.length - 2;
        /**lMax, rMax代表目前为止左右柱子的最大高度 */
        int lMax = height[0];
        int rMax = height[height.length - 1];
        int ans = 0;
        while(left < right) {
            /**lMax小计算左边,rMax大更新右边,中间记得尝试更细lMax和rMax*/
            if(lMax < rMax) {
                ans += Math.max(0, lMax - height[left]);
                lMax = Math.max(lMax, height[left ++]);
            } else if(rMax < lMax) {
                ans += Math.max(0,rMax - height[right]);
                rMax = Math.max(rMax, height[right --]);
            } else {
                ans += Math.max(0,lMax - height[left]);
                ans += Math.max(0,rMax - height[right]);
                lMax = Math.max(lMax, height[left ++]);
                rMax = Math.max(rMax, height[right--]);
            }
        }
        /**如果最后是因为left=right退出的,需要单独结算一下这个位置 */
        if(left == right) {
            ans += Math.max(0, Math.min(lMax, rMax) - height[left]);
        }
        return ans;
    }
}

运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringData基础学习

一、SpringData 概述 二、SpringData JPA HelloWorld 三、Repository 接口

快速入门:使用Python构建学生成绩管理应用

前言 诸位观众&#xff0c;本学期我有幸学习了Python编程课程。随着课程的结束&#xff0c;授课教师布置了一项任务&#xff0c;要求我们开发一个学生信息管理系统。基于老师的要求&#xff0c;我个人独立完成了这项任务。今天&#xff0c;我希望将这个简易的程序分享给大家&a…

《黑神话·悟空》是用什么编程语言开发的?

最近国内出了一款3A大作的游戏&#xff0c;凭借牛b的画面、文化底蕴、剧情&#xff0c;已经吸引了很多人入局&#xff0c;当然小孟也在第一时间尝鲜。 最直接的感受&#xff1a;效果牛b&#xff0c;画面牛b&#xff0c;游戏好玩。但是时间太忙&#xff0c;准备过年的放假的时候…

PMP–知识卡片--鱼骨图

鱼骨图由日本质量管理大师石川馨发明&#xff0c;也称因果图&#xff0c;原本用于质量管理。现在多用于问题整理。 在使用该工具时&#xff0c;把问题写在鱼骨的头上&#xff0c;然后召集同事&#xff0c;尽可能多的找出问题&#xff0c;大骨写大问题&#xff0c;中小骨写中小…

Web前端性能优化合集

简介 自互联网兴起以来&#xff0c;从最初的静态网页到如今的动态交互、单页应用&#xff08;SPA&#xff09;、PWA&#xff08;Progressive Web Apps&#xff09;等&#xff0c;互联网技术正在飞速发展&#xff0c;随着用户体验成为核心竞争力之一&#xff0c;前端性能直接影…

哪种电容笔更好用一点?2024开学季实测五款高性价比电容笔!

近年来&#xff0c;随着无纸化学习的日益普及&#xff0c;电容笔的重要性越来越凸显&#xff0c;但面对市场上数不清的电容笔种类和品牌&#xff0c;我们到底该选择哪种电容笔更好用一点呢&#xff1f;趁着即将开学&#xff0c;好多小伙伴都在寻找学习用品和数码好物之际&#…

Python Selenium实现自动化测试及Chrome驱动使用!

本文将介绍如何使用Python Selenium库实现自动化测试&#xff0c;并详细记录了Chrome驱动的使用方法。 通过本文的指导&#xff0c;读者将能够快速上手使用Python Selenium进行自动化测试。 并了解如何配置和使用Chrome驱动来实现更高效的自动化测试。 一、Python Selenium简…

2024年甘肃省安全员C证证考试题库及甘肃省安全员C证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年甘肃省安全员C证证考试题库及甘肃省安全员C证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

运动耳机哪个牌子好?五大高品质巅峰机型汇总!

​对于运动时享受音乐的朋友来说&#xff0c;耳机的舒适度至关重要&#xff0c;它直接影响到我们能否在运动中发挥最佳状态。无论是高端旗舰耳机还是性价比较高的入门级产品&#xff0c;长时间佩戴的不适感都可能干扰我们的运动节奏。因此&#xff0c;开放式耳机因其不入耳的设…

数据资产价值评价:开启数据要素市场的关键钥匙

数据资产价值评价&#xff1a;开启数据要素市场的关键钥匙 前言数据资产价值评价 前言 数据资产作为当今数字化时代的重要生产要素&#xff0c;其价值评价至关重要。数据资产的价值在于与应用场景的紧密结合&#xff0c;不同场景下数据所贡献的经济价值存在显著差异。例如&…

WIFI 模组8286驱动

原理图&#xff1a; 注&#xff1a;使用的数串口1的引脚&#xff0c;PA1是发送端引脚&#xff0c;PA3是接收端引脚&#xff0c;PA7串口的使能位。 1.0 WIFI模组驱动 驱动初始化函数&#xff1a; void WifiModuleDrvInit(void) {WifiGpioInit();WifiUartInit(115200);WifiDmaIn…

window系统如何适用redis

目录 1、解压缩安装包 2、命令行启动服务 3、客户端连接 4、redis客户端工具 1、解压缩安装包 2、命令行启动服务 3、客户端连接 4、redis客户端工具

CSS3多行多栏布局

当前布局由6个等宽行组成&#xff0c;其中第四行有三栏&#xff0c;第五行有四栏。 重点第四行设置&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>img {hei…

踩坑集之Video Processing Subsystem

问题描述 Video Processing Subsystem (VPSS) 功能强大&#xff0c;但我们在应用中只需要其中某个子功能。如果使用完整版本&#xff0c;资源消耗会非常大。VPSS将所有子功能封装在一起&#xff0c;所以我们将IP配置为仅包含CSC的模式&#xff0c;以为不需要的功能就不会影响系…

致远OA OCR票据识别组件

OCR票据识别 技术支持 技术大佬支持本文档 使用范围 任何票种信息&#xff0c;只要需要对接到oa底表中&#xff0c;就能够实现各种票种&#xff0c;各种字段的对接&#xff0c;包括票据识别&#xff0c;发票核验&#xff0c;适配各种票据 使用介绍 1 配置每种发票的ocr设…

【Nginx】快速入门

概述 Nginx(engine x)是一个高性能的HTTP和反向代理web服务器。 特点是占有内存小&#xff0c;并发能力强&#xff0c;简单易配置&#xff0c;支持高达 50000 个并发连接数的响应。 作用 代理 正向代理&#xff1a; 反向代理&#xff1a; 负载均衡 Nginx提供的负载均衡策…

专题---自底向上的计算机网络(物理层)

目录 计算机网络概述 物理层 数据链路层 网络层 运输层 应用层 网络安全 详细见http://t.csdnimg.cn/MY5aI http://t.csdnimg.cn/8Ipa4 http://t.csdnimg.cn/uvMxS 信道复用技术不仅在物理层有运用&#xff0c;在数据链路层也确实需要信道复用技术。‌ 数据链路层是…

推荐一个java企业级快速开发平台-JeeSite

文章目录 前言一、项目介绍二、技术选型基本技术框架其他技术框架分布式技术框架 三、项目特点四、功能介绍五、源码下载六、官方文档总结 前言 大家好&#xff0c;今天为大家推荐一个java 企业级系统快速开发平台&#xff0c;JeeSite。它是一个企业级快速开发解决方案&#x…

https://developer.nvidia.com/cuda-toolkit-archive

CUDA Toolkit Archive | NVIDIA Developerhttps://developer.nvidia.com/cuda-toolkit-archive

matplotlib color颜色全面指南

要想把数据表示得生动的趣&#xff0c;往往需要使用多种颜色来配合&#xff0c;才可以让数据得已区分开来。那么就来学习一下matplotlib的颜色。在matplotlib里主要使用一些简单的字母来表示颜色&#xff0c;比如&#xff1a; 参考&#xff1a; Matplotlib Color Tutorials L…