【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 = 0n = len(nums)preSum = [0]# 求前缀和数组,第i位置代表nums前面i个相加,共有len(nums)+1长tmp = 0for 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 += 1return count
class Solution:def subarraySum(self, nums: List[int], k: int) -> int:# 要求的连续子数组count = 0n = len(nums)preSums = collections.defaultdict(int)   #其键是前缀和,值是该前缀和出现的次数。preSums[0] = 1presum = 0for i in range(n):presum += nums[i]    # if preSums[presum - k] != 0:count += preSums[presum - k]   # 利用defaultdict的特性,当presum-k不存在时,返回的是0。这样避免了判断preSums[presum] += 1  # 给前缀和为presum的个数加1return count
【暴力解法】
class Solution:def subarraySum(self, nums: List[int], k: int) -> int:# 要求的连续子数组count = 0n = len(nums)for i in range(n):sum = 0for j in range(i, n):sum += nums[j]if sum == k:count += 1 return count

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

在这里插入图片描述

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

from collections import dequeclass 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]+=1needCnt=len(t)left=0res=(0,float('inf'))for index,c in enumerate(s):if need[c]>0:  #如果需要字母cneedCnt-=1need[c]-=1if needCnt==0:       #步骤一:滑动窗口包含了所有T元素while True:      #步骤二:增加left,排除多余元素c=s[left] if need[c]==0:breakneed[c]+=1left+=1if index-left<res[1]-res[0]:   #记录结果,当前窗口左指针left,右指针indexres=(left,index)need[s[left]]+=1  #步骤三:left增加一个位置,寻找新的满足条件滑动窗口needCnt+=1left+=1return '' 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 = 1for 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 + 1return 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.搜索二维矩阵||

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

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

相关文章

一些智能音箱类的软硬件方案

主要参考资料 Rabbit R1: https://www.rabbit.tech/rabbit-r1 mediatek-helio-p35: https://www.mediatek.com/products/smartphones-2/mediatek-helio-p35 NSdisplay: https://www.nsdisplay.com/ai-holobox-mini/ai-holobox-mini.html RK3566: https://www.rock-chips.com/a/…

常用技巧-PPT时你真的做对了吗?

常用技巧-PPT时你真的做对了吗&#xff1f; PPT时通常会通过多种表现手法将信息转化为图表&#xff0c;更好的凸显自己的专业素养。将数据转化为图表是对的&#xff0c;那么你真的用对了图表了吗&#xff1f; 话不多说&#xff0c;直接上干货&#xff1a; 时间线图 时间线是…

AI网络爬虫:对网页指定区域批量截图

对网页指定区域批量截图&#xff0c;可以在deepseek的代码助手中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;一步一步的思考&#xff0c;完成一个对网页指定区域截图的python脚本的任务&#xff0c;具体步骤如下&#xff1a; 设置User-Agent: Mozilla/5.0 (…

基于深度学习的CT影像肺癌检测识别

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 肺癌是全球范围内导致癌症死亡的主要原因之一&#xff0c;早期检测和诊断对于提高患者生存率至关重要。随着深度学习技术的迅猛发展&#xff0c;基于CT影像的肺癌检测识别成为了研究热点。本文介绍…

线段交点检测:扫描线算法

NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 几何对象的相交检测是计算…

ChatGPT Edu版本来啦:支持GPT-4o、自定义GPT、数据分析等

5月31日&#xff0c;OpenAI在官网宣布&#xff0c;推出ChatGPT Edu版本。 据悉&#xff0c;这是一个专门为大学校园提供的ChatGTP&#xff0c;支持GPT-4o、网络搜索、自定义GPT、数据分析、代码生成等功能&#xff0c;可以极大提升学生、老师的学习质量和教学效率。 目前&…

【UE5教程】使用蓝图显示鼠标

首先&#xff0c;在您的项目中创建一个新的蓝图类&#xff0c;继承自PlayerController。在蓝图编辑器中&#xff0c;找到Event BeginPlay节点&#xff0c;并从它引出一条线。添加Set Show Mouse Cursor节点&#xff0c;勾选Visible&#xff0c;以确保鼠标在游戏开始时可见。 鼠…

python-web应用程序-Django数据库

python-web应用程序-Django数据库-操作表 原始方法&#xff1a; import pymysql#1.链接mysql conn pymysql.connect(host127.0.0.1,port 2206,user root,passwd root123,charset utf8,db unicom) cursor conn.cursor(cursor pymysql.cursors.DictCursor)#2.发送指令 …

1.4 Unicode简介

现在的Windows操作系统有许多不同语言版本&#xff0c;可以支持所有国家现有的语言文字。这就涉及到不同字符集的编码规则。 本节必须掌握的知识点&#xff1a; 字符集 C语言款字符 宽字符和Windows 1.4.1 字符集 ■ANSI多字节字符集 ●ASCII码 现代计算机发源于美国&…

云原生架构案例分析_3.某快递公司核心业务系统云原生改造

名称解释&#xff1a; 阿里云ACK&#xff1a;阿里云容器服务 Kubernetes 版 ACK&#xff08;Container Service for Kubernetes&#xff09;集成Kubernetes网络、阿里云VPC、阿里云SLB&#xff0c;提供稳定高性能的容器网络。本文介绍ACK集群网络及阿里云网络底层基础设施的重要…

[Algorithm][动态规划][回文串问题][回文子串][最长回文子串][分割回文串Ⅳ]详细讲解

目录 0.原理讲解1.回文子串1.题目链接2.算法原理详解3.代码实现 2.最长回文子串1.题目链接3.代码实现 3.分割回文串 IV1.题目链接2.算法原理详解3.代码实现 0.原理讲解 动态规划能够将所有的子串是否是回文的信息&#xff0c;保存在dp表里面状态表示一般经验&#xff1a;以[i,…

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…

基于Vue3的Uniapp实训项目|一家鲜花店

基于Vue的Uniapp实训指导项目 项目预览&#xff1a; 在这里插入图片描述 pages.json {"pages": [ //pages数组中第一项表示应用启动页&#xff0c;参考&#xff1a;https://uniapp.dcloud.io/collocation/pages{"path": "pages/index/index",&…

群体优化算法---蜂群优化算法应用于数据挖掘

介绍 蜂群优化算法&#xff08;Bee Algorithm, BA&#xff09;及其变种主要模拟蜜蜂的觅食行为&#xff0c;以解决复杂的优化问题。这类算法通过蜜蜂之间的信息交流和协作来探索解空间&#xff0c;寻找全局最优解。主要应用于参数优化&#xff0c;结构优化&#xff0c;机器学习…

The First项目报告:去中心化知识产权治理协议MON Protocol如何革新链游产业?

2023年12月&#xff0c;RPG NFT 游戏 Pixelmon 首席执行官 GiulioX 在 X 平台表示&#xff0c;确认将推出代币 MON&#xff0c;代币生成&#xff08;TGE&#xff09;时间将取决于 MON 的路线图和主流 CEX 的启动板队列。12 月 11 日&#xff0c;RPG NFT 游戏 Pixelmon 首席执行…

element-plus的Layout组件

elment-plus的layout组件包括el-row和e-col&#xff0c;和bootstrap的栅格类似&#xff0c;e-row采用flex布局&#xff0c;分成了24个栅栏&#xff0c;单个e-col默认占24,可以通过span属性指定其大小&#xff0c;offset属性指定其偏移的栅栏个数。e-row组件的父组件不要使用dis…

深度学习(三)

5.Functional API 搭建神经网络模型 5.1利用Functional API编写宽深神经网络模型进行手写数字识别 import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom…

Stable diffusion文生图大模型——隐扩散模型原理解析

1、前言 本篇文章&#xff0c;我们将讲这些年非常流行的文生图大模型——Stable Diffusion。该模型也不难&#xff0c;甚至说很简单。创新点也相对较少&#xff0c;如果你学会了我以前的文章讲过的模型&#xff0c;学习这个也自然水到渠成&#xff01; 参考论文&#xff1a;H…

腾讯云 TDMQ for Apache Pulsar 多地区高可用容灾实践

作者介绍 林宇强 腾讯云高级工程师 专注于消息队列、API网关、微服务、数据同步等 PaaS 领域。有多年的开发和维护经验&#xff0c;目前在腾讯云从事 TDMQ Pulsar 商业化产品方向的研发工作。 导语 本文将从四个维度&#xff0c;深入剖析 Pulsar 在多可用区高可用领域的容…

大数据—元数据管理

在大数据环境中&#xff0c;元数据管理是确保数据资产有效利用和治理的关键组成部分。元数据是描述数据的数据&#xff0c;它提供了关于数据集的上下文信息&#xff0c;包括数据的来源、格式、结构、关系、质量、处理历史和使用方式等。有效的元数据管理有助于提高数据的可发现…