力扣 41 42.接雨水问题详细讲解,保证看完必会接雨水问题!!!时间复杂度最优解 o(n)

news2024/12/26 16:01:17

首先来个开胃小菜,41.缺少最小整数(难度:困难)真实感觉像是个简单级别

41. 缺失的第一个正数
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0]
输出:3
示例 2:
输入:nums = [3,4,-1,1]
输出:2
示例 3:
输入:nums = [7,8,9,11,12]
输出:1

题解:

先对数组排序,便于判断,由于要加入此时所缺最小正整数,1 为最小正整数
则先对数组判断,要是没有1 则直接返回要加入1 
若有1 ,则其前后俩数进行判断,如果前后俩数差大于1(注意前一个数是负数的情况需进行判断),则加入比后一个数大1的数
否则此时数组相当于依次存储(差都为1,即无数可插)此时返回 插入最大值+1
注意:由于事先已进行排序,故不存在前后俩数之差小于 1 的情况
class Solution(object):
    def firstMissingPositive(self, nums):
        nums.sort()
        if 1 not in nums:
            return 1
        for i in range(1, len(nums)):
            if nums[i] - nums[i-1] > 1 and nums[i-1] > 0:
                return nums[i-1] + 1
        return max(nums) + 1

手动分割!!!

重点!!!接雨水问题

俩种解法;

1.前后缀数组解法

前后缀方法 即计算出每个点的接水量
类似与短板水桶

          |
          |  |
   pre->  |__|  <-sue
   
   类似这样 前后缀相当于告诉以这个点为底他的筒壁高度,选取较小的
   水量=筒壁高*底宽-底厚
   因为咱们是一个点一个点计算,且题目告知高度是连续的,则桶底是1
   水量=min(pre,sue)-h
   注意:
   当是间隔形式时桶底需重新计算
  (就是高度数组连续,但是实际摆放有间隔,
    因为咱们是根据数组进行操作,所以此时需要计算桶底长度)

   注意:
   当是间隔形式时桶底需重新计算(就是高度数组连续,但是实际摆放有间隔,因为咱们是根据数组进行操作,所以此时需要计算桶底长度)

class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        res=0
        # 保存前后缀的数组
        pre=[0]*len(height)
        sue=[0]*len(height)
        # 第一个与最后一个没法比较需要申明
        pre[0]=height[0]
        sue[-1]=height[-1]
        #记录前后缀
        for i in range(1,len(height)):
            pre[i]=max(height[i],pre[i-1])
        for i in range(len(height)-2,-1,-1):
            sue[i]=max(height[i],sue[i+1])
            # 计算雨量
        for i in range(len(height)):
            res+=min(pre[i],sue[i])-height[i]
        return res

2.双指针优化,减少空间复杂度

双指针指向头尾,计算前后缀,
如果前缀最大值小于后缀最大值则此时L指向的点的水量就可计算,同时指针右移
如果前缀最大值大于后缀最大值则此时r指向的点的水量就可计算,同时指针左移
可以结合上面的前后缀数组就可以看出来,前后缀的最大值会一直影响后面的前后缀
举例:
如果是前缀是1 后缀是2,因为前后缀每次都是选最大值值所以不管后继怎么变化,
现在l所指向的点最终肯定是前缀小于后缀的,故这时可以直接,按前缀数值进行计算水量
class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        n=len(height)
        # 定义双指针
        l,r=0,n-1
        pre_max,sue_max,res=0,0,0
        while l<r:
            # 计算前后缀最大值
            pre_max=max(pre_max,height[l])
            sue_max=max(sue_max,height[r])
            # 进行判断,是否可以计算水量
            if pre_max<sue_max:
                res+=pre_max-height[l]
                l+=1
            elif pre_max>sue_max:
                res+=sue_max-height[r]
                r-=1
            # 这一步else可写可不写,此时为相等的情况计算那一边都行,可以在上面俩个判断中任意一个加上相等判断
            else:
                res+=pre_max-height[l]
                l+=1
        return res

这应该是暂时最优解,时间复杂度o(n)  空间复杂度o(1) 只有一些变量

本算法借鉴于力扣灵神思路,进行了整合及解释,更易懂,当然眼看千遍不如手敲一遍,建议大家可以手推一遍更易理解。

欢迎大家评论区提问!!!

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

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

相关文章

干货:机器学习之线性代码基础

资料地址&#xff1a;https://machine-learning-from-scratch.rea 线性代数 0. 要点汇总1. 向量 Vector 1.1 向量是什么1.2 向量的运算 1.2.1 向量的加法1.2.2 向量的数乘 2. 线性组合、张成的空间与基 Linear Combination, Span and Basis 2.1 运算封闭2.2 线性组合2.2 向量…

Android进阶之路 - TextView文本渐变

那天做需求的时候&#xff0c;遇到一个小功能&#xff0c;建立在前人栽树&#xff0c;后人乘凉的情况下&#xff0c;仅用片刻就写完了&#xff1b;说来惭愧&#xff0c;我以前并未写过文本渐变的需求&#xff0c;脑中也仅有一个shape渐变带来的大概思路&#xff0c;回头来看想着…

Proteus的网络标号与总线

Proteus为了减少过多、复杂的连线&#xff0c;可以使用网络标号与总线配合使用。 Proteus的导线上添加了网络标号&#xff0c;意味着在Proteus上相同的网络标号是连在一起的&#xff0c;所说在图纸上看不出来。 如下图是比较好的Proteus中使用总线的绘制的图纸。可以效仿着画…

【坤坤之夜 KUNKUNNIGHT】- 探索神秘世界,开启刺激冒险之旅!

你是否准备好迎接一个充满挑战和惊喜的单机游戏体验&#xff1f;坤坤之夜&#xff08;KUNKUNNIGHT&#xff09;将带你进入一个神秘而刺激的世界&#xff0c;让你尽情探索&#xff0c;解锁各种有趣的技能和道具&#xff0c;解决谜题&#xff0c;完成各种挑战。 坤坤之夜的游戏画…

CodeMeter软件保护及授权管理解决方案(二)

客户端管理工具 CodeMeter Runtime是CodeMeter解决方案中的重要组成部分&#xff0c;其为独立软件包&#xff0c;开发者需要把CodeMeter Runtime和加密后的软件一起发布。CodeMeter Runtim包括以下组件用于实现授权的使用&#xff1a; CodeMeter License Server授权服务器 Co…

我叫:基数排序【JAVA】

1.自我介绍 基数排序(radix sort)属于“分配式排序” (distribution sort)&#xff0c;又称“桶子法” (bucket sort)或bin sort,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,是‘桶排序’的扩展 2.基本思想 将所有待比较数值统一为同样的数位长度,数位较短的数…

【图论】重庆大学图论与应用课程期末复习资料(私人复习资料)

考试章节范围 第一章&#xff1a;1.1、1.2、1.3 填空 顶点集和边集都有限的图&#xff0c;称为有限图只有一个顶点的图&#xff0c;称为平凡图边集为空的图&#xff0c;称为空图顶点数为n的图&#xff0c;称为n阶图连接两个相同顶点的边的条数称为边的重数&#xff1b;重数大…

荣耀冲击高端,一边推新「修路」,一边降价「拆桥」

作者 | 辰纹 来源 | 洞见新研社 从2020年11月17日与华为分家&#xff0c;开启独立创业之路&#xff0c;到成功逆袭&#xff0c;今年第三季度以18%的份额重回中国智能手机市场榜首&#xff0c;荣耀用了3年时间。 图源&#xff1a;Canalys 在这三年时间内&#xff0c;荣耀经历…

unity学习笔记07

一、组件 有几个物体他们之间有着重复的功能&#xff0c;该如何避免重复的去写代码&#xff1f; 可以将一些相同的功能写成一个组件&#xff0c;也就是组件就等同于功能。 什么是组件&#xff1f; 在Unity中&#xff0c;游戏物体是不具备任何功能的&#xff0c;如果想要为其…

解决api-ms-win-crt-runtime-l1-1-0.dll丢失的问题,全是干货分享

今天我的电脑中突然出现关于“api-ms-win-crt-runtime-l1-1-0.dll”的错误提示&#xff0c;关闭提示后再次打开程序依然不能正常打开&#xff0c;出现这样的问题突然不知道是因为什么&#xff0c;于是就去了解了关于出现api-ms-win-crt-runtime-l1-1-0.dll错误的问题&#xff0…

一款LED段码显示屏驱动芯片方案

一、基本概述 TM1620是一种LED&#xff08;发光二极管显示器&#xff09;驱动控制专用IC,内部集成有MCU数字接口、数据锁存器、LED驱动等电路。本产品质量可靠、稳定性好、抗干扰能力强。 二、基本特性 采用CMOS工艺 显示模式&#xff08;8段6位&#xff5e;10段4位&#xff…

YOLOv5原创改进:全维动态卷积再改进,GCODConv

目录 一、原理 网络结构 二、代码 三、应用到YOLOv5中 一、原理

自定义注解的定义及使用场景

文章目录 1. 自定义注解如何使用2. 自定义注解使用场景2.1 自定义注解使用AOP做权限校验2.2 自定义注解使用AOP记录用户操作日志2.3 自定义注解使用AOP记录接口请求时长 1. 自定义注解如何使用 需要使用interface修饰&#xff0c;加上三个元注解 Documented&#xff1a;生成API…

微信预约小程序制作

对于许多新手来说&#xff0c;制作微信预约小程序可能是一项挑战&#xff0c;但并非不可能。本文将通过详细的步骤&#xff0c;指导您从零开始制作一个微信预约小程序。首先&#xff0c;您需要找一个合适的第三方制作平台或工具&#xff0c;乔拓云网就是其中之一。 找一个合适的…

入门指南:Vue的安装配置和开发环境设置

背景&#xff1a; ​ 这里想讲一讲为什么使用框架&#xff0c;而不使用原生的HTML、CSS、JavaScript写。原生开发虽然灵活&#xff0c;但在大型项目中可能导致代码重复、维护困难等问题&#xff0c;不符合软件工程的"高内聚低耦合"原则。例如&#xff0c;如果每个页…

人工智能 - 图像分类:发展历史、技术全解与实战

目录 一、&#xff1a;图像分类的历史与进展历史回顾深度学习的革命当前趋势未来展望 二&#xff1a;核心技术解析图像预处理神经网络基础卷积神经网络&#xff08;CNN&#xff09;深度学习框架 第三部分&#xff1a;核心代码与实现环境搭建数据加载和预处理构建CNN模型模型训练…

Python异常处理:try语句的应用与技巧

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 异常处理在Python中是至关重要的。try-except是用于捕获和处理异常的核心机制之一。让我们深入了解如何使用try-except&#xff0c;处理各种异常情况。 try-except语句 在编程中&#xff0c;异常是指运行时发生…

linux环境下编译安装OpenCV For Java(CentOS 7)

最近在业余时间学习了一些有关图像处理的代码&#xff0c;但是只能本地处理&#xff0c;满足不了将来开放远程服务的需求。 因此&#xff0c;查找并参考了一些资料&#xff0c;成功在centos7环境安装上了opencv 460。 下面上具体安装步骤&#xff0c;希望能帮到有需要的同学。 …

贝叶斯Python实践

贝叶斯统计学是一种基于贝叶斯定理的概率推理方法&#xff0c;它在机器学习领域得到了广泛的应用。Python作为一门简洁、灵活和易学的编程语言&#xff0c;为贝叶斯统计学的实践提供了强大的工具和库。在本文中&#xff0c;我们将探讨贝叶斯在Python中的实践&#xff0c;包括贝…

数据集笔记 :PEMS-BAY

数据地址&#xff1a;DCRNN - Google 云端硬盘 各station 位置&#xff1a;DCRNN/data/sensor_graph/graph_sensor_locations_bay.csv at master liyaguang/DCRNN (github.com) 1 读取 数据 import h5py fileDownloads/pems-bay.h5fh5py.File(file,r) f.keys()f[speed] #&…