算法第三十一天-直方图的水量

直方图的水量

题目要求

在这里插入图片描述

解题思路

使用面向列的计算比面向行的计算更加容易。我们只需要考虑当前的位置的左右最高模板的高度。

方法一、暴力解法

每个位置能接到多少雨水,很容易想到[木桶效应],即是由两边最短的木板限制的。那么直观思路就是,对于每个位置,向左右找最高的木板,当前位置能放的水量是:左右两边最高木板的最低高度-当前高度。

方法二、动态规划

从暴力法向两边求最高木板,这里其实是有重复计算的。比较直观的优化思路是:先提前遍历一次,求出每个位置左右最高的模板,把结果保存在数组里。就可以避免求解雨水的for循环中计算高度了。

方法三、双指针

双指针解法是上面的解法的进一步优化,主要作用是为了降低空间复杂度。
使用了两个指针leftright分别指向左右两个端点的柱子。
另外用lHeightrHeight分别表示左右两个指针遇到过的最高的柱子,注意上面的动态规划做法是提前计算出来每个位置的最高柱子。
双指针移动的思想是看left和right两个柱子那个更矮,因为蓄水时的瓶颈时更矮的柱子,而更高的柱子其实是不用考虑的。所以每次把更爱的柱子向中间移动。

代码

暴力法

class Solution:
    def trap(self, height: List[int]) -> int:
        res=0
        for i in range(1,len(height)-1,1):
            lHeight=max(height[:i])
            rHeight=max(height[i+1:])
            h = min(lHeight,rHeight) - height[i]
            if h>0:
                res +=h
        return res

动态规划

N=len(height)
        if N<2:return 0
        lHeight=[0]*N
        lHeight[0] = height[0]
        rHeight=[0]*N
        rHeight[N - 1] = height[N - 1]
        for i in range(1,N):
            lHeight[i] = max( lHeight[i-1], height[i])
        for i in range(N-2,-1,-1):
            rHeight[i]=max(rHeight[i+1], height[i])
        res=0
        for i in range(N):
            h = min(lHeight[i],rHeight[i])-height[i]
            if h >0:
                res +=h
        return res
        

双指针

class Solution(object):
    def trap(self, height):
        N = len(height)
        if N < 2: return 0
        left, right = 0, N - 1
        lHeight = rHeight = 0
        res = 0
        while left < right:
            if height[left] < height[right]:
                if height[left] < lHeight:
                    res += lHeight - height[left]
                else:
                    lHeight = height[left]
                left += 1
            else:
                if height[right] < rHeight:
                    res += rHeight - height[right]
                else:
                    rHeight = height[right]
                right -= 1
        return res

复杂度分析

暴力法动态规划双指针
时间复杂度 O ( N 2 ) O(N^2) O(N2) O ( N ) O(N) O(N) O ( N ) O(N) O(N)
空间复杂度 O ( 1 ) O(1) O(1) O ( N ) O(N) O(N) O ( 1 ) O(1) O(1)

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

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

相关文章

C语言 动态内存管理

目录 前言 一、动态内存分配 二、malloc和free函数 2.1 malloc函数 2.2 free函数 三、calloc和realloc函数 3.1 calloc函数 3.2 realloc函数 四、常见的动态内存的错误 1.对NULL指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态开辟内存使用free释放 4.使用…

深度学习-2.8模型拟合概念和欠拟合模型、过拟合调整策略

模型拟合概念和欠拟合模型、过拟合调整策略 文章目录 模型拟合概念和欠拟合模型、过拟合调整策略一、模型拟合度概念介绍1.测试集的“不可知悖论”2.模型拟合度概念与实验 二、过拟合、欠拟合问题解决方案1. 欠拟合解决方案2.过拟合解决方案 三、神经网络结果选择策略1. 参数和…

拼多多2023年实现营收2476亿 助力品质好物与消费升级双向奔赴

拼多多集团近日发布了截至去年12月31日的财务业绩报告&#xff0c;拼多多在2023年第四季度实现了889亿元的营收&#xff0c;同比增长了惊人的123%。而在全年范围内&#xff0c;拼多多的营收更是高达2476亿元&#xff0c;同比增长了90%。 去年是拼多多全面拥抱高质量发展的元年…

晶体管图示仪 能测 IGBT. Mosfet. Diode. BJT......

STD2000晶体管图示仪系统能测试很多电子元器件的静态直流参数&#xff08;如击穿电压V(BR)CES/V(BR)DSs、漏电流ICEs/lGEs/IGSs/lDSs、阈值电压/VGE(th)、开启电压/VCE(on)、跨导/Gfe/Gfs、压降/Vf、导通内阻Rds(on)&#xff09;。 测试种类覆盖 7 大类别26分类&#xff0c;包…

解锁企业数字化运营管理:论专业数据中台解决方案的重要性-亿发

没有数据中台&#xff0c;数字化经营就像是建立在沙滩上的城堡&#xff0c;缺乏坚实的基础支撑。数据中台对于企业数字化经营能力的建设至关重要&#xff0c;它扮演着连接、整合和管理数据的关键角色&#xff0c;出现将扩展企业可利用数据的范围。传统的业务分析主要使用财务数…

Python使用PaddleOCR进行图片转文字

PaddleOCR是百度飞桨开发的OCR库 安装 安装PaddleOCR&#xff0c;只需要两个命令&#xff1a; pip install paddlepaddle2.4.2 pip install paddleocr 基本使用 PaddleOCR的使用也很简单&#xff1a; from paddleocr import PaddleOCR# use_angle_cls&#xff1a;是否使用…

高通 8255 基本通信(QUP)Android侧控制方法说明

一&#xff1a;整体说明 高通8255芯片中&#xff0c;SPI IIC UART核心统一由QUP V3 进行控制 QUP V3为可编程模块&#xff0c;可以将不同通道配置为SPI IIC UART通路&#xff0c;此部分配置在QNX侧 QUP 资源可以直接被QNX使用&#xff0c;Android侧可以通过两种方法使用QUP资源…

Android Audio相关

AudioManager AudioService的Bp端&#xff0c;调用AudioManager>AudioService&#xff08;代码实现&#xff09; AudioService 继承自IAudioService.Stub&#xff0c;为Bn端 AudioSystem AudioService功能实现都依赖于AudioSystem&#xff0c;AudioService通过AudioSys…

SCXI-1193 控制器 多路复用器开关模块 NI 仪器仪表 SCXI-1001

规范 SCXI -1193 500 MHz四路8x1 50多路复用器 本文件列出了SCXI-1193多路复用器模块的规格。所有规格均为 如有变更&#xff0c;恕不另行通知。请访问ni.com/manuals了解最新规格。 配置四路8x1多路复用器 双通道16x1多路复用器 单路32x1多路复用器 四路4x1端接多路复用器 双路…

Java Swing游戏开发学习15

内容来自RyiSnow视频讲解 这一节讲的是Title Screen&#xff0c;直译&#xff1a;标题屏幕。视频开始没有字幕了&#xff0c;比较考验听力[/doge]&#x1f436;&#xff0c;常听到不认识的单词&#xff0c;一边猜&#xff0c;一边琢磨意思。作者说有许多人讨论如何实现non-gam…

地理数据表达方式学习——KML与SHP

一、KML-Keyhole Markup Language Keyhole Markup Language (KML)是一种XML符号&#xff0c;用于浏览器中二维地图和三维地球的地理注释和地理可视化&#xff08;地理数据包括点、线、面、多边形、多面体以及模型等&#xff09;。KML是伴随着Google Earth的使用而开发的&#x…

ROS机器人入门第一课:ROS快速体验——python实现HelloWorld

文章目录 ROS机器人入门第一课&#xff1a;ROS快速体验——python实现HelloWorld一、HelloWorld实现简介&#xff08;一&#xff09;创建工作空间并初始化&#xff08;二&#xff09;进入 src 创建 ros 包并添加依赖 二、HelloWorld(Python版)&#xff08;二&#xff09;进入 r…

Doris实战——工商信息查询平台的湖仓一体建设

目录 前言 一、架构1.0&#xff1a;传统Lambda架构 二、OLAP引擎调研 三、架构2.0&#xff1a;数据服务层All in Apache Doris 四、架构 3.0&#xff1a;基于Doris Multi-Catalog的湖仓一体架构 五、实践经验 5.1 引入Merge-on-Write&#xff0c;百亿级单表查询提速近三…

好用的客服快捷回复软件推荐

在当今快节奏的商业环境中&#xff0c;客户服务的效率和质量已经成为企业成功的关键因素之一。对于客服工作人员来说&#xff0c;面对海量的客户咨询和问题解答&#xff0c;如何快速而准确地回复&#xff0c;成为了他们日常工作中的一大挑战。选择一款好用的快捷回复工具是非常…

如何做人才运营战略?

招聘人才和人才获取是同义词&#xff0c;但它们并不相同。招聘是大多数雇主的短期解决方案&#xff0c;而人才获取是一个长期解决方案。 企业要想改善企业文化朝着统一的愿景努力&#xff0c;就需要关注长期规划。 人才获取vs人才招聘 招聘是为了填补空缺&#xff0c;人才获取…

“人工智能+”平台能力,如何助力企业打造新质生产力?

导读&#xff1a;打造新质生产力&#xff0c;为什么离不开强大的数智平台&#xff1f; 2024年开年&#xff0c;新质生产力成为经济领域的第一热词。 提到新质生产力&#xff0c;很多人会想到以人工智能为代表的科技创新。2024年政府工作报告提出&#xff1a;要“深化大数据、人…

C# 异常捕获

文章目录 C# 异常捕获捕获异常运行效果 自定义异常运行结果 抛出异常 C# 异常捕获 捕获异常 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp2 {class Test{int result;Test(){r…

力扣Lc20--- 202.快乐数(java版)-2024年3月20日

1.题目 2.知识点 &#xff08;1&#xff09;while (seen.contains(n) false) { // 循环体 } 与 !seen.contains(n) 等同 &#xff08;2&#xff09; 当传入数字 19 给 isHappy(19) 方法时&#xff0c;下面是每一行代码的执行过程&#xff1a; 初始化一个空的 HashSet&#…

元宇宙:数字化世界的下一个时代

元宇宙&#xff08;Metaverse&#xff09;概念是一个3D平台&#xff0c;作为用户可以参与不断成熟的虚拟世界&#xff0c;元宇宙应该被视为互联网发展的延续&#xff0c;以用户为中心。因为在这个三维虚拟平台上&#xff0c;我们都可以结识其他人、玩游戏、购物或工作。设想一个…

栈和队列的学习

存储方式分两类&#xff1a;顺序存储和链式存储 栈&#xff1a;只允许从一端进行数据插入和删除的线性表&#xff1a;先进后出 FILO 队列&#xff1a;只允许从一端进行数据插入&#xff0c;另一端进行数据删除的线性表&#xff1a;先进先出 FIFO 栈 创建空栈&#xff0c;创建…