【leetcode10-21】子串、普通数组、矩阵

子串

560.和为K的子数组【没理解】

在这里插入图片描述

什么是前缀和:前缀和指一个数组的某下标之前的所有数组元素的和(包含其自身)
通常,会在前缀和首位放一个0。比如数组[1,2,3。其前缀和是[0,1,3,6]
前缀和通常可以帮助我们快速计算某个区间内的和。比如我们要算i,ji,ji,j之间的和,那么就是nums[i]+nums[i+1]+⋯+nums[j]nums[i]

  • nums[i+1] + \cdots +nums[j]nums[i]+nums[i+1]+⋯+nums[j]。他可以看作是nums[0]+nums[1]+⋯+nums[i]+nums[i+1]+⋯+nums[j]nums[0]
  • nums[1] + \cdots + nums[i] + nums[i+1] + \cdots +nums[j]nums[0]+nums[1]+⋯+nums[i]+nums[i+1]+⋯+nums[j]减去nums[0]+nums[1]+⋯+nums[i−1]nums[0]
  • nums[1] + \cdots + nums[i-1]nums[0]+nums[1]+⋯+nums[i−1]。这个式子也是preSum[j]−preSum[i−1]preSum[j]
  • preSum[i-1]preSum[j]−preSum[i−1]。
class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        # 要求的连续子数组
        count = 0
        n = len(nums)
        preSum = [0]

        # 求前缀和数组,第i位置代表nums前面i个相加,共有len(nums)+1长
        tmp = 0
        for i in range(n):
            tmp += nums[i]
            preSum.append(tmp)
        
        # 求和为k的连续子数组,求i到j之间的和
        for i in range(1, n+1):
            for j in range(i, n+1):
                if preSum[j] - preSum[i-1] == k:  # preSum[j] - preSum[i-1]代表着在nums数组中,前j个数之和减去前i-1个数之和
                    count += 1
        
        return count
class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        # 要求的连续子数组
        count = 0
        n = len(nums)
        preSums = collections.defaultdict(int)   #其键是前缀和,值是该前缀和出现的次数。
        preSums[0] = 1

        presum = 0
        for i in range(n):
            presum += nums[i]    
            # if preSums[presum - k] != 0:
            count += preSums[presum - k]   # 利用defaultdict的特性,当presum-k不存在时,返回的是0。这样避免了判断
            preSums[presum] += 1  # 给前缀和为presum的个数加1
        return count
【暴力解法】
class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        # 要求的连续子数组
        count = 0
        n = len(nums)
        
        for i in range(n):
            sum = 0
            for j in range(i, n):
                sum += nums[j]
                if sum == k:
                    count += 1 
        return count

239.滑动窗口最大值【大顶堆】

在这里插入图片描述

代码随机录写过这道题:使用大顶堆

from collections import deque


class MyQueue: #单调队列(从大到小
    def __init__(self):
        self.queue = deque() #这里需要使用deque实现单调队列,直接使用list会超时
    
    #每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。
    #同时pop之前判断队列当前是否为空。
    def pop(self, value):
        if self.queue and value == self.queue[0]:
            self.queue.popleft()#list.pop()时间复杂度为O(n),这里需要使用collections.deque()
            
    #如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。
    #这样就保持了队列里的数值是单调从大到小的了。
    def push(self, value):
        while self.queue and value > self.queue[-1]:
            self.queue.pop()
        self.queue.append(value)
        
    #查询当前队列里的最大值 直接返回队列前端也就是front就可以了。
    def front(self):
        return self.queue[0]
    
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        que = MyQueue()
        result = []
        for i in range(k): #先将前k的元素放进队列
            que.push(nums[i])
        result.append(que.front()) #result 记录前k的元素的最大值
        for i in range(k, len(nums)):
            que.pop(nums[i - k]) #滑动窗口移除最前面元素
            que.push(nums[i]) #滑动窗口前加入最后面的元素
            result.append(que.front()) #记录对应的最大值
        return result

76.最小覆盖子串【双指针|滑动窗口】

在这里插入图片描述

  1. 用need字典维护,当前还需要的字符以及个数,need[i]为负数,代表无需求,need[i]代表需要
  2. 滑动串口,先让right动起来,左指针指向队首,如果能cover字符T;就开始收缩窗口,让left滑动,直至不能coverT
  3. 在窗口滑动过程中,维护的need也要变,加入字符,就–,减去字符就+
    如果尝试访问一个在 defaultdict 中不存在的键,它会自动创建一个新键,并将其值设置为默认值(在这个例子中是 0)。但是{}不支持自动创建键
    def minWindow(self, s: str, t: str) -> str:
        need=collections.defaultdict(int)
        for c in t:
            need[c]+=1
        needCnt=len(t)
        left=0
        res=(0,float('inf'))
        
        for index,c in enumerate(s):
            if need[c]>0:  #如果需要字母c
                needCnt-=1
            need[c]-=1
            if needCnt==0:       #步骤一:滑动窗口包含了所有T元素
                while True:      #步骤二:增加left,排除多余元素
                    c=s[left] 
                    if need[c]==0:
                        break
                    need[c]+=1
                    left+=1
                if index-left<res[1]-res[0]:   #记录结果,当前窗口左指针left,右指针index
                    res=(left,index)
                need[s[left]]+=1  #步骤三:left增加一个位置,寻找新的满足条件滑动窗口
                needCnt+=1
                left+=1
        return '' if res[1]>len(s) else s[res[0]:res[1]+1]    #如果res始终没被更新过,代表无满足条件的结果

普通数组

53.最大子数组和【动态规划】

在这里插入图片描述

这里是引用
因为dp[i]只与dp[i-1]和nums[i]有关,因此直接在nums原地修改,空间复杂度O(1)

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        for i in range(1,len(nums)):
            nums[i] = max(nums[i-1]+nums[i],nums[i])
        return max(nums)

56.合并区间

在这里插入图片描述

  1. 先对左节点排序
  2. 判断当前合并区间和候选区间,是否重叠
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        ans = []
        intervals.sort()  # 按照所有区间的左端点进行排序
        for interval in intervals:
            if not ans or ans[-1][1] < interval[0]:   #当ans为空,或者 当前区间的右节点 在 候选区间的左边【无重叠】
                ans.append(interval)
            else: #当前并区间和候选区间  有重叠
                ans[-1][1] = max(interval[1],ans[-1][1])   #取最大右区间
        return ans

189.轮转数组

在这里插入图片描述

直接用nums会报错??
修改nums[:]不会影响到nums,nums[;]是一个新列表,是nums的副本,她两指向不同内存地址

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        k = k % len(nums)
        nums[:] = nums[len(nums)-k:] + nums[:len(nums)-k]
        return nums

238.除自身以外数组的乘积

在这里插入图片描述

这里是引用

  1. 先初始化ans,ans[0]=1;辅助变量temp=1
  2. 计算下三角,计算上三角乘积temp,并乘以上三角
    索引容易搞错,可以看个图,根据图写索引
class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        ans = [1] * len(nums)
        temp = 1
        for i in range(1,len(nums)):
            ans[i] = ans[i-1] * nums[i-1]  #下三角
        for j in range(len(nums)-2,-1,-1):
            temp *= nums[j+1]   #上三角
            ans[j] *= temp   #下三角 * 上三角
        return ans

41.缺失的第一个正数【困难】

在这里插入图片描述

最后的结果一定是在 [1,n+1] 内
修改 nums,使对应的下标 [0,n] 里 nums[i] 第一个不是 i+1 的,i+1 就是答案
也就是,让 nums 里的数字,在 [1,n] 内的,都去他们对应的 [0,n-1] 位置上去的

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        n = len(nums)
        for i in range(n):
            while 1 <= nums[i] <= n and nums[nums[i] - 1] != nums[i]:
                # 这是错误的
                # nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
         #先计算右边的值,也就是nums[i]和nums[nums[i] - 1]的值,然后将他们赋值给一个临时元祖;
#然后按顺序赋值给左边,也就是说会先修改nums[i]的值,这样一来,nums[i] - 1就不是原来想要修改的下标了。
                nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
        for i in range(n):
            if nums[i] != i + 1:
                return i + 1
        return n + 1

矩阵

73.矩阵置0

在这里插入图片描述

两遍扫matrix,第一遍用集合记录哪些行,哪些列有0;第二遍置0

class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        row = len(matrix)
        col = len(matrix[0])
        row_zero = set()
        col_zero = set()
        for i in range(row):
            for j in range(col):
                if matrix[i][j] == 0:
                    row_zero.add(i)
                    col_zero.add(j)
        for i in range(row):
            for j in range(col):
                if i in row_zero or j in col_zero:
                    matrix[i][j] = 0
                

54.螺旋矩阵

在这里插入图片描述

48.旋转图像

240.搜索二维矩阵||

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

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

相关文章

【控制实践——四旋翼无人机】【一】四旋翼无人机运动分析和建模

传送门 系列博客前言坐标系定义及姿态位置描述坐标系定义姿态描述及坐标系变换 受力分析牛顿-欧拉方程状态空间方程总结 系列博客 前言 在C站摸爬滚打一段时间后&#xff0c;发现控制类相关的圈子较小&#xff08;话题热度低&#xff09;&#xff0c;想顺便跟各位同行读者了解…

Netty是什么?深入理解高性能网络框架

Netty是什么&#xff1f;——深入理解高性能网络框架 引言 在现代互联网应用中&#xff0c;网络通信是不可或缺的一部分。无论是构建微服务架构、游戏服务器、实时通信系统还是物联网应用&#xff0c;高效稳定的网络编程框架都是成功的关键。Netty&#xff0c;作为一款高性能…

项目:仿RabbitMQ实现的消息队列组件

文章目录 写在前面开源仓库和项目上线其他文档说明 需求分析BrokerServer交换机类型持久化消息应答 模块划分服务端模块客户端模块交换机数据管理模块队列数据管理模块绑定数据管理模块消息数据管理模块队列信息管理模块虚拟机数据管理模块路由匹配模块消费者管理模块信道管理模…

HTML+CSS+JS 选项卡导航栏

效果演示 实现了一个导航栏切换内容的效果。页面上方有一个导航栏,每个导航项都有一个圆形背景,点击导航项时,圆形背景会放大并显示对应的内容。每个内容区域都包含一个大号字母,数字会在内容区域显示时淡入。点击其他导航项时,当前内容区域会淡出并隐藏,同时新的内容区域…

[数据集][目标检测]csgo头部身体检测数据集VOC+YOLO格式1265张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1265 标注数量(xml文件个数)&#xff1a;1265 标注数量(txt文件个数)&#xff1a;1265 标注…

群体优化算法----人工蜂群优化算法应用于路径规划(机器人避开平面障碍寻找最短路线)

介绍 人工蜂群优化算法&#xff08;Artificial Bee Colony Algorithm, ABC&#xff09;是由Dervis Karaboga在2005年提出的一种模拟蜜蜂觅食行为的优化算法。该算法基于蜜蜂群体的分工合作和信息交流机制&#xff0c;通过模拟蜜蜂寻找食物源的过程来解决优化问题。ABC算法因其…

mybatis—plus和mybatis的区别

一前置知识&#xff1a; CRUD操作&#xff08;create 添加数据read读取数据 update 修改数据delete删除数据&#xff09; 二&#xff0c;总体概览 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发工作、提高…

INT202 例题

算法复杂度 O(n)&#xff1a;表示算法的渐进上界。如果一个算法的运行时间是O(n)&#xff0c;那么它的运行时间最多与输入规模n成正比。换句话说&#xff0c;当输入规模n增加时&#xff0c;算法的运行时间不会超过某个常数倍的n。比如&#xff0c;如果一个算法的时间复杂度是O(…

【InternLM实战营第二期笔记】04:XTuner 微调 LLM:1.8B、多模态、Agent

文章目录 笔记微调基础知识Xtuner8G显存微调模型InternLM2 1.8B多模态实践环节数据微调过拟合WebUI 交互 多模态微调 作业 这回学乖了&#xff0c;打开本节课第一件事先不看教程而是装环境~ 笔记 微调基础知识 这里感慨一下&#xff0c;垂直领域的训练还是挺困难的&#xff0c;…

jenkins的简单使用

2.1.简介 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 2.4.Jenkins安装 1.下载安装包jenkins.war&#xff1b; 2.在安装…

dpdk uio整体分析及网卡加载

参考:https://zhuanlan.zhihu.com/p/477600165 一、Linux内核知识点 1. __attribute__ constructor/destructor (1)若函数被设定为constructor属性,则该函数会在 main()函数执行之前被自动的执行。 (2)若函数被设定为destructor属性,则该函数会在main()函数执…

C++类的继承与派生概念

派生和继承是自然界普遍存在的一种现象。例如&#xff0c;“猫”和“白猫”。当人们谈及“猫”时&#xff0c;知道它有4条腿&#xff0c;1条尾巴&#xff0c;抓老鼠,为哺乳动物。如谈论“白猫”时&#xff0c;它也是猫&#xff0c;只不过增加了一个新的特征&#xff0c;即它的毛…

Harmony开发 List/Scroll 组件最后一个item显示不全或布局显示不完整

今天在做Harmony开发的时候遇到一个问题,List组件的最后一个item显示不全&#xff0c;如下图&#xff0c;item-9显示不出来&#xff0c;显示了一部分 这个页面的代码结构如下&#xff1a; Column() {Row() {Text(文本1).fontSize(15).fontColor(Color.Black)Text(文本2).font…

论文浅尝 | THINK-ON-GRAPH:基于知识图谱的深层次且可靠的大语言模型推理方法...

笔记整理&#xff1a;刘佳俊&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/pdf/2307.07697.pdf 1. 动机 本文是IDEA研究院的工作&#xff0c;这篇工作将知识图谱的和大语言模型推理进行了结合&#xff0c;在每一步图推理中利用大…

2024视频号·短视频+直播极简培训班:抓住视频号风口,流量红利

课程下载&#xff1a;2024视频号短视频直播极简培训班&#xff1a;抓住视频号风口&#xff0c;流量红利-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 02 1、为什么视频号有机会&#xff0c;而不是抖音?(直播2024.03.0…

攻防世界---misc---can_has_stdio?

1、下载附件是一个没有后缀的文件&#xff0c;尝试将后缀改为txt发现里面有一些特殊字符的编码 2、查阅资料得知它是一种编程代码 3、知道了它是什么代码之后&#xff0c;我们就去解码&#xff08;网址&#xff1a;El Brainfuck (copy.sh)&#xff09; 4、 flag{esolangs_for_f…

Centos 7之Hadoop搭建

介绍 Hadoop Distributed File System简称 HDFS&#xff0c;是一个分布式文件系统。HDFS 有着高容错性&#xff08;fault-tolerent&#xff09;的特点&#xff0c;并且设计用来部署在低廉的&#xff08;low-cost&#xff09;硬件上。而且它提供高吞吐量&#xff08;high throu…

2024年Node.js精选:50款工具库集锦,项目开发轻松上手(五)

不得不说&#xff0c;Node.js的强大离不开那150万个NPM包。没有NPM&#xff0c;Node.js依然可以使用&#xff0c;但绝不会如此强大。在这个系列文章中&#xff0c;我们探讨了每个开发者都应该了解的一些常用NPM包。在本系列的最后一篇文章中&#xff0c;我将介绍第41到第50个推…

QT 创建文件 Ui 不允许使用不完整类型,可以尝试添加一下任何头文件

#include "debug.h" #include "qmessagebox.h" #pragma execution_character_set("utf-8") //QT 创建文件 Ui 不允许使用不完整类型,尝试添加一下任何头文件&#xff0c;或者添加ui_xx.h头文件 debug::debug(QWidget *parent) : QDialog(p…

番外篇 | YOLOv5改进之结合结构重参数化网络RepVGG:极简架构,SOTA性能,让VGG式模型再次伟大!

前言:Hello大家好,我是小哥谈。ResNet、DenseNet等复杂的多分支网络可以增强模型的表征能力,使得训练效果更好,但是多分支的结构在推理的时候效率严重不足。看起来二则不可兼得。能否两全其美?RepVGG通过结构重参数化的方法,在训练的时候使用多分支结构,而在推理的时候多…