LeetCode每日一题-接雨水

news2024/12/23 17:45:23

给定 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 个单位的雨水(蓝色部分表示雨水)。 

class Solution {
    public int trap(int[] height) {
        int len =  height.length;
        int ans = 0; //结果

        int i;
        //左侧雨水
        //去除开头为0
        for(i = 0;i<len && height[i]==0;i++);

        int j = i++;//左侧第一个不为0的下标
        
        for(;i<len;i++){
            //记录 [2 0 2]    这种所有要写 >= 记录下来雨水
            if(height[i] >= height[j]){
                //统计 i 跟 j 之间有多少雨水
                for(int k = j+1;k<i;k++){
                    ans += height[j] - height[k];
                }
                //设置j的新起点
                j = i;
            }   
        }

        //为什么记录右侧雨水不怕中间重复呢,因为从左开始记录雨水就只有height[i] >= height[j]才会记录
        //而记录右侧雨水时只有height[i] > height[j]才会记录,其实记录雨水时,ans最多发生一次改变
        //就是[3 2 1 2 1]这种情况就要记录右侧雨水
        //           |
        //  |     |  |  |     |  
        //  |  |  |  |  |  |  |  |
        //  0  1  2  3  4  5  6  7
        //从左侧记录时雨水为1,其实下标为5地方也能存个一雨水,所有才要再从右侧执行一次

        //右侧雨水    
        //去除结尾为0
        for(i = len-1;i>=0 && height[i]==0;i--);
        j = i--;//右侧第一个不为0的下标
        
        for(;i>=0;i--){
            //这里就写 > 就行了,因为上面已经记录了
            if(height[i] > height[j]){
                //统计 i 跟 j 之间有多少雨水
                for(int k = j-1;k>i;k--){
                    ans += height[j] - height[k];
                }
                //设置j的新起点
                j = i;
            }   
        }
        return ans;
    }
}

思路二:

class Solution {
    //                 h: 0 1 0 2 1 0 1 3 2 1 2 1
    //前缀最大值数组 pre: 0 1 1 2 2 2 2 3 3 3 3 3
    //后缀最大值数组 suf: 3 3 3 3 3 3 3 3 2 2 2 1
    //算法核心  ans += Math.min(pre[i],suf[i]) - h[i];
    //取最小边的高度 - 自己的高度
    
    //下面是优化而来
    public int trap(int[] height) {
        int ans = 0;
        int len = height.length;
        int pre_max=0, suf_max=0;//前缀最大值和后缀最大值
        int l = 0,r=len-1;
        while(l<r){
            pre_max = Math.max(pre_max,height[l]);
            suf_max = Math.max(suf_max,height[r]);
            if(pre_max < suf_max){
                ans += pre_max - height[l++];
            }else{
                ans += suf_max - height[r--];
            }
        }
        return ans;
    }
}

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

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

相关文章

宋版“三国演义”(北宋、辽、西夏和南宋、金、蒙古)

1 北宋、辽、西夏三国演义 宋、辽、西 夏鼎立形势图 公元960年&#xff08;后周显德七年&#xff09;&#xff0c;后周大将赵匡胤陈桥兵变黄袍加身&#xff0c;建立了宋朝。 然而&#xff0c;北方有一个资格比它老的国家&#xff0c;是为契丹人建立的辽国。 辽创立于五代初。…

《MySQL》第十一篇 SQL_MODEL模式简述

目录 一. 介绍与使用二. 模式类型三. 常用模式演示ANSI 模式TRADITIONAL 模式STRICT_TRANS_TABLES 模式 一. 介绍与使用 SQL Mode定义了MySQL应支持的SQL语法、数据校验等&#xff0c;这样可以更容易地在不同的环境中使用MySQL 常用来解决下面几类问题&#xff1a; 通过设置S…

ad+硬件每日学习十个知识点(14)23.7.25(以太网IC)

文章目录 1.什么是隔离电路&#xff0c;什么是隔离芯片&#xff1f;2.网线接口RJ45和RJ11的区别&#xff1f;&#xff08;我们用的电脑都是RJ45&#xff09;3.什么是rgmii协议&#xff1f;4.什么是以太网协议&#xff1f;5.以太网IC的连接方式6.以太网协议都包含哪些协议&#…

RocketMQ, Dashboard, 控制台安装

文章说明 本文主要说明RocketMQ的控制台&#xff08;Dashboard&#xff09;的安装过程。工作中一直用的是别人装好的&#xff0c;这次终于自己亲手装了一遍。 由于每次都要启动三个应用&#xff0c;比较烦&#xff0c;于是我写了一键启动脚本&#xff0c;分享给大家。这个脚本…

AC695-按键处理-带UI

AC695-按键修改 消息发出 对应界面处理

0725 区块链1.0 2.0 3.0 智能合约 比特币 以太坊 DAG 有向无环图

文献阅读&#xff1a;[1]华亚洲. 基于改进Block-DAG区块链的时空数据存储及查询方法研究[D].辽宁大学,2022.DOI:10.27209/d.cnki.glniu.2022.001364.[1]华亚洲,丁琳琳,陈泽等.面向时空数据的区块链构建及查询方法[J].计算机应用,2022,42(11):3429-3437. 文献总结&#xff1a; …

基于MQTT阿里云服务器的物联网关灯项目--舵机

一、关灯神器 本文章由作者李建华所编写,用到的服务器是阿里云部署好的mqtt,链接如有失效,请联系作者微信:Likz777777 要求&#xff1a;不破坏原有功能、可以接入苹果、网页小程序均可控制 设备&#xff1a;香橙派、舵机 具体实现方法&#xff1a; 1.局域网控制&#xff1a…

PHP在线相册--【白嫖项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图phpStudy 设置导数据库项目目录如图&#xff1a;代码部分&#xff1a;主页 配套资源作业&#xff1a; 本系列校训 用免费公开视频&#xff0c;卷飞培训班哈人&…

LeetCode算法心得——合并后数组中的最大元素

大家好&#xff0c;我是晴天学长&#xff0c;这是一道动态规划的逆向思维题&#xff0c;此题甚是神奇&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa; 1 &#xff09;合并后数组中的最大元素 2) .算法思路 只能选择旁边的&#xff0c;而且还是比自己等大或者比自己小的…

码银送书第四期《Python之光》

作为一种极其流行的编程语言&#xff0c;Python已经成为了当今最为重要的生产力工具之一。无论小学生还是各行各业的从业人员&#xff0c;都开始学习Python编程。这种编程语言在许多领域中都有广泛的应用&#xff0c;因此Python编程已经成为了许多职业的必备能力或者加分项。 …

【云边有个小卖部】上新《探秘Linux》第二章 Linux权限管理

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1C初阶C进阶数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我…

mac下安装vue cli脚手架并搭建一个简易项目

目录 1、确定本电脑下node和npm版本是否为项目所需版本。 2、下载vue脚手架 3、创建项目 1、下载node。 如果有node&#xff0c;打开终端&#xff0c;输入node -v和npm -v , 确保node和npm的版本&#xff0c;(这里可以根据自己的需求去选择&#xff0c;如果对最新版本的内容有…

JVM | 类加载是怎么工作的

类加载是怎么工作的 引言类加载器工作原理 | 城市建设过程1. 类加载器加载类前过程JVM进程启动 | 建筑工程立项Bootstrap类加载器创建扩展和应用类加载器 | 高级工程师的两位得力助手 2. 类加载器加载类后过程应用类加载器加载Building链接过程&#xff08;验证&#xff0c;准备…

Huge and Efficient! 一文了解大规模预训练模型高效训练技术

本文分为三部分介绍了大模型高效训练所需要的主要技术&#xff0c;并展示当前较为流行的训练加速库的统计。文章也同步发布在AI Box知乎专栏&#xff08;知乎搜索 AI Box专栏&#xff09;&#xff0c;欢迎大家在知乎专栏的文章下方评论留言&#xff0c;交流探讨&#xff01; 引…

计算机图形学十四路径追踪与渲染方程

路径追踪&#xff08;Path Tracing&#xff09;与渲染方程&#xff08;Render Equation&#xff09; 简介 利用路径追踪我们可以实现比whitted-style ray tracing更好的全局光照&#xff08;GI&#xff09;效果。它的理论基础是渲染方程&#xff0c;最开始由吉姆卡吉亚&#…

066、故障处理之热点问题

为什么要解决热点 分布式架构中各个组件的理想状态&#xff1a;资源利用率相对均衡 形成写热点的原因 高频访问的小表SQL执行计划不合理具有顺序增长属性的索引扫描 数据组织模型 例如数据是序列递增&#xff0c;则有可能数据全部都集中一个region上 &#xff0c;或者集中…

什么是等保定级?

TOC 一、等保评测介绍 1.1 等保定级目的 网络安全等级保护介绍&#xff1a;目的就是涉及民生问题的信息系统&#xff0c;要按照影响&#xff0c;提前划定等级 实施网络安全保护 信息系统&#xff1a;就是保护的系统&#xff0c;比如 魔幻的 健康码系统安全产品&#xff1a;健…

【lesson5】linux常见权限问题

文章目录 目录权限umask粘滞位 目录权限 先来思考一个问题: 进入一个目录需要什么权限呢&#xff1f; 由上图我们可以得知&#xff0c;进入目录需要x权限&#xff0c;那么没有r和w权限是什么情况呢&#xff1f; 从图中我们可以得知没有r权限不能查看目录里面的内容&#xff…

基于STM32设计的智能教室管理系统

前言 本文介绍了一个智慧教室的设计,该设计由电器设备控制系统、环境检测系统和考勤系统三大模块构成。通过使用STM32微处理器和物联网电器设备控制中心,实现对教室内风扇、照明灯和窗帘等电器设备的智能化统一控制与运行。同时,环境检测系统可以实时监测环境光强、温度、湿…

模型调参及优化

调参 调权重参数&#xff0c;偏置参数 训练数据集用来训练参数w&#xff0c;b 调超参数 验证数据集用来选择超参数学习率lr&#xff0c;隐藏层大小等 如何调参 当泛化误差和训练误差都没有降下去说明欠拟合&#xff1b;当训练误差降下去&#xff0c;但泛化误差出现上升形式&…