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

首先来个开胃小菜,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) 只有一些变量

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

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

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

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

相关文章

制作心理咨询小程序的详细指南

随着科技的的发展&#xff0c;小程序已经成为了人们日常生活中不可或缺的一部分。特别是在心理咨询这个领域&#xff0c;小程序可以提供一个更为便捷、高效的服务平台。本文将通过乔拓云平台为例&#xff0c;详细介绍如何制作一个心理咨询小程序。 首先&#xff0c;我们需要注册…

销门!销售秘籍都在这了

很多刚进销售行业&#xff0c;或者初入职场的小白&#xff0c;肯定会有这一段迷茫/茫然期&#xff1a;为什么同事每天都有客户打电话/实地拜访呢&#xff1f; 而自己却无所事事&#xff0c;也没有客户找我&#xff0c;也不知道去哪里拜访客户。 这个阶段对于销售小白来说是很…

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

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

Mysql解决随机选取问题

常规的随机选取效率差的原因&#xff1a; 两种解决方法&#xff1a; 总结&#xff1a;

【Redis基础】Redis基本的全局命令

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; Redis基本的全局命令 1&#xff0c;KEYS命令 语法&#xff1a;KEYS pattern KEYS命令用来查询服…

深度学习知识点

深度学习过程 data [] for i,d in enumerate(data):image,label d image,label image.cuda(),label.cuda()img net(image)optimizer.zero_grad()#需要将梯度信息清零&#xff0c;因为梯度计算是按照batch分批次计算的&#xff0c;如果这一批batch没清零&#xff0c;会影响…

深入理解堆排序:建堆、排序与优化

引言 在计算机科学中&#xff0c;堆排序是一种高效的排序算法&#xff0c;利用堆的数据结构特性进行排序。本文将深入探讨堆排序的原理、实现过程&#xff0c;并介绍一种优化方法&#xff0c;以帮助读者更好地理解和运用这一经典算法 目录 堆排序简介 1.1 什么是堆排序&#x…

Vue生命周期

生命周期 Vue.js 组件生命周期&#xff1a; 生命周期函数&#xff08;钩子&#xff09;就是给我们提供了一些特定的时刻&#xff0c;让我们可以在这个周期段内加入自己的代码&#xff0c;做一些需要的事情; 生命周期钩子中的this指向是VM 或 组件实例对象 在JS 中&#xff0c;…

JRT实现缓存协议

上一篇介绍的借助ORM的增、删、改和DolerGet方法&#xff0c;ORM可以很精准的知道热点数据做内存缓存。那么就有一个问题存在&#xff0c;即部署了多个站点时候&#xff0c;如果用户在一个Web里修改数据了&#xff0c;那么其他Web的ORM是不知道这个变化的&#xff0c;其他Web还…

局部性原理和伪共享

CPU Cache CPU Cache可以理解为CPU内部的高速缓存。CPU从内存读取数据时&#xff0c;将要读取的数据及其相邻地址的数据&#xff0c;即至少一个Cache Line&#xff0c;写入Cache&#xff0c;以便后续访问时提高读取速度。 CPU存在多级Cache&#xff0c;级别最高的离CPU最近&a…

实现电商平台与营销系统无缝集成:雅座的无代码开发与API连接

无代码开发&#xff1a;营销的新引擎 在数字化转型的浪潮中&#xff0c;无代码开发已成为企业提升效率、减少成本的新引擎。这种开发方式允许非技术人员通过图形界面构建应用程序&#xff0c;无需编写代码即可实现复杂功能。这对于营销、广告推广以及用户运营等业务尤为重要&a…

贪心 53. 最大子序和 122.买卖股票的最佳时机 II

53. 最大子序和 题目&#xff1a; 给定一个数组&#xff0c;有正有负&#xff0c;找出一个连续子序列的总和最大&#xff08;子数组最少一个&#xff09; 暴力思路&#xff1a; 双层for循环&#xff0c;记录每一次可能的子序列的总和&#xff0c;初始为整数最小值&#xff…

Go语言实现大模型分词器tokenizer

文章目录 前言核心结构体定义构造函数文本初始处理组词构建词组索引训练数据编码解码打印状态信息运行效果总结 前言 大模型的tokenizer用于将原始文本输入转化为模型可处理的输入形式。tokenizer将文本分割成单词、子词或字符&#xff0c;并将其编码为数字表示。大模型的toke…

ArkTS-取消标题与自定义标题栏

文章目录 取消标头自定义标题栏导入Resources自定义跳转动画关于底部tabBar导航文本输入(TextInput/TextArea)自定义样式添加事件可以是onChange可以是onSubmit List列表组件设置主轴方向 网格布局服务卡片-获取地理位置页面获取地理位置服务卡片获取地理位置 可以先看看&#…

wvp 视频监控平台抓包分析

抓包时机 下面的抓包时机是抓包文件最新&#xff0c;但是最有用的包 选择网卡开始抓包 如果之前已经选择网卡&#xff0c;直接开始抓包 停止抓包 重新抓包 sip播放过程分析 过滤条件 tcp.port 5060 and sip 可以看到有这些包 选择任何一个 &#xff0c;戍边右键--追踪流--…

【批处理常用命令及用法大全】

文章目录 1 echo 和 回显控制命令2 errorlevel程序返回码3 dir显示目录中的文件和子目录列表4 cd更改当前目录5 md创建目录6 rd删除目录7 del删除文件8 ren文件重命名9 cls清屏10 type显示文件内容11 copy拷贝文件12 title设置cmd窗口的标题13 ver显示系统版本14 label 和 vol设…

加密挖矿、AI发展刺激算力需求激增!去中心化算力时代已来临!

2009年1月3日&#xff0c;中本聪在芬兰赫尔辛基的一个小型服务器上挖出了比特币的创世区块&#xff0c;并获得了50BTC的出块奖励。自加密货币诞生第一天起&#xff0c;算力一直在行业扮演非常重要的角色。行业对算力的真实需求&#xff0c;也极大推动了芯片厂商的发展&#xff…

matlab三维地形图

matlab三维地形图 %%%%—————Code to draw 3D bathymetry—————————— %-------Created by bobo,10/10/2021-------------------- clear;clc;close all; ncdisp E:\data\etopo\scs_etopo.nc filenmE:\data\etopo\scs_etopo.nc; londouble(ncread(filenm,lon)); lat…

【深度学习笔记】06 softmax回归

06 softmax回归 softmax运算损失函数对数似然Fashion-MNIST数据集读取数据集读取小批量整合所有组件 softmax回归的从零开始实现初始化模型参数定义softmax操作定义模型定义损失函数分类精度训练预测 softmax回归的简洁实现 softmax运算 softmax函数能够将未规范化的预测变换为…

C语言——实现一个计算m~n(m<n)之间所有整数的和的简单函数。

#include <stdio.h>int sum(int m, int n) {int i;int sum 0;for ( i m; i <n; i){sum i;}return sum;}int main() { int m, n;printf("输入m和n&#xff1a;\n");scanf("%d,%d", &m, &n);printf("sum %d\n", sum(m, n)…