【Leetcode】top 100 子串

560 和为k的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 

子数组是数组中元素的连续非空序列。

思路:一次遍历元素,当当前累积和超过k时(若当前元素>k,直接切换到下一元素),去除前置元素至和小于k(用长度length调用前置元素)

class Solution(object):def subarraySum(self, nums, k):""":type nums: List[int]:type k: int:rtype: int"""summ, length, out = 0, 0, 0for i, val in enumerate(nums):if val >= k:summ, length = 0, 0out += 1 if val == k else 0continueelse:summ, length = summ+val, length+1if summ < k:continueelse:while summ > k: length -= 1summ -= nums[i-length]   if summ == k:length -= 1summ -= nums[i-length]out+=1return out#这一版代码只适用于数组元素为正的情况...只能通过32/93个案例

官方思路前缀和 sum[i, j] = pre[j]-pre[i-1]=k  由于 i-1<j,所以遍历到下标 j 时就能判断 [0,j] 内有多少满足求和条件的子数组;

class Solution(object):def subarraySum(self, nums, k):""":type nums: List[int]:type k: int:rtype: int"""tmp = {0:1}summ, out = 0, 0for i in range(len(nums)):summ += nums[i]out += tmp[summ-k] if summ-k in tmp else 0            tmp[summ] = 1 if summ not in tmp else tmp[summ]+1#在[0:i-1]内搜索前缀和,再更新[0;j]的前缀和      return out
 239 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 

官方思路:当窗口右滑 有新元素入窗时,移出所有值小于新元素的元素,再判断现有最大值是否超出窗口长度, 用双向队列来维护当前窗口内元素坐标;

from collections import dequeclass Solution(object):def maxSlidingWindow(self, nums, k):""":type nums: List[int]:type k: int:rtype: List[int]"""idx = deque()out = []for i in range(len(nums)):while idx and nums[i] > nums[idx[-1]]:   #pop对空队列操作会报错idx.pop()idx.append(i)# if i == k-1:out.append(nums[idx[0]])   #i=k-1时刚好取完第一个窗口长度,此时需要取一次最大值if i >= k-1:                             while idx[0] <= i-k:                 #当i=k时才会需要判断最大值是否超过窗口idx.popleft()out.append(nums[idx[0]])return out
双端队列
1.len(deque)  
2.deque.appendleft(val)   #将val插入到队头deque.append(val)       #将val插入到队尾deque.insert(idx, val)  #将val放在idx,idx越界时会自动更改到边界位置deque.extendleft(list)  #将list插入到队头   会改变list中元素的相对位置deque.extend(list)      #将list插入到队尾
3.deque.popleft()         #移除队头元素deque.pop()             #移除队尾元素,队列为空会报错
4.deque[idx] = val        #通过索引更改元素
5.deque.index(val)        #查找元素对应的索引,没有匹配会报错
6.deque.count(val)        #统计val的数量
7.deque.remove(val)       #移除第一个匹配的元素,没有匹配会报错deque.clear()           #清空
8.deque.reverse()         #翻转deque.rotate(k)         #循环右移k步(首尾相接)
76 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""

官方思路:用双指针维护一个滑动窗口,先增大right指标至窗口内能找到t中的全部字母,然后移动left指标缩小窗口;在即将要破坏满足全部字母的条件时,若此时窗口长度更小,则记录下指针坐标;

class Solution(object):def minWindow(self, s, t):""":type s: str:type t: str:rtype: str"""if len(s) < len(t):return ''hasht = {}left, right, out = 0, 0, [0, len(s)+1]for i in range(len(t)):                                #用counter可以直接生成字典hasht[t[i]] = hasht[t[i]] + 1 if t[i] in hasht else 1while right < len(s):if s[right] in hasht: hasht[s[right]] = hasht[s[right]] - 1                     while max(hasht.values()) == 0 and left <= right:  #此时找到所有元素,移动left指针if s[left] in hasht: hasht[s[left]] = hasht[s[left]] + 1if right-left<out[1]-out[0]:out[0], out[1] = left, right+1            #切片右侧取不到left += 1right += 1return '' if out[1]>len(s) else s[out[0]:out[1]]

优化:max(hasht.values()) == 0 需要每次遍历,可以用needcnt记录欠缺元素的数量;

class Solution(object):def minWindow(self, s, t):""":type s: str:type t: str:rtype: str"""if len(s) < len(t):return ''left, right, out = 0, 0, [0, len(s)+1]needcnt = len(t)hasht = Counter(t)while right < len(s):if s[right] in hasht: hasht[s[right]] = hasht[s[right]] - 1      if hasht[s[right]] >= 0: needcnt -= 1    #只有hasht[s[i]]为负时才是重复元素        while needcnt == 0 and left <= right:  if s[left] in hasht: hasht[s[left]] = hasht[s[left]] + 1if hasht[s[left]] > 0: needcnt += 1  #只有hasht[s[i]]为正时才是欠缺元素if right-left<out[1]-out[0]:out[0], out[1] = left, right+1        left += 1right += 1return '' if out[1]>len(s) else s[out[0]:out[1]]

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

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

相关文章

设计模式:软件开发的秘密武器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

HTML:注释的 5 种场景和 5 点注意事项

你好&#xff0c;我是云桃桃。 HTML 代码注释是用来在 HTML 源代码中添加一些说明性文字&#xff0c;而不会显示在页面中的内容。它们不会在浏览器中显示或渲染。 现在我们一起来看看它的语法&#xff0c;用途和注意事项吧。 注释语法 HTML 注释的基本语法格式是: <!--…

利用Nginx正向代理实现局域网电脑访问外网

引言 在网络环境中&#xff0c;有时候我们需要让局域网内的电脑访问外网&#xff0c;但是由于网络策略或其他原因&#xff0c;直接访问外网是不可行的。这时候&#xff0c;可以借助 Nginx 来搭建一个正向代理服务器&#xff0c;实现局域网内电脑通过 Nginx 转发访问外网的需求…

绝赞春招拯救计划 -- 数据结构篇

哈希表 来吧&#xff01;一文彻底搞定哈希表&#xff01; - 知乎 (zhihu.com) 百科解释&#xff1a; “散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。也就是说&…

免费的 AI 视频生成工具 Moonvalley 厉害了!Moonvalley 怎么用(保姆级教程)

一、Moonvalley 介绍 Moonvalley&#xff0c;号称地表最强的 AI 视频生成工具&#xff0c;到底有多厉害&#xff1f;今天一起来看一下~ 这是 Moonvalley 官网的介绍&#xff1a; Moonvalley 是一个开创性的新型文本到视频的生成式 AI 模型。用简单的文本即可创建出惊人的电影和…

【机器学习】支持向量机 | 支持向量机理论全梳理 对偶问题转换,核方法,软间隔与过拟合

支持向量机走的路和之前介绍的模型不同 之前介绍的模型更趋向于进行函数的拟合&#xff0c;而支持向量机属于直接分割得到我们最后要求的内容 1 支持向量机SVM基本原理 当我们要用一条线&#xff08;或平面、超平面&#xff09;将不同类别的点分开时&#xff0c;我们希望这条…

蓝桥杯练习系统(算法训练)ALGO-976 P0804字符串压缩

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 编写一个函数void strcompress(char *s)&#xff0c;输入一个字符串&#xff08;只包含小写字母和空格&#xff0c;且长度小于1000&am…

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation 这篇论文是基于VideoCrafter的&#xff0c;而VideoCrafter是基于LVDM的 关于LVDM可以看https://blog.csdn.net/Are_you_ready/article/details/136615853 2023年12月6日发表在arxiv 这篇论文讨论…

【深度学习】线性回归

Linear Regression 一个例子线性回归机器学习中的表达评价函数好坏的度量&#xff1a;损失&#xff08;Loss&#xff09;损失函数&#xff08;Loss function&#xff09;哪个数据集的均方误差 (MSE) 高 如何找出最优b和w?寻找最优b和w如何降低损失 (Reducing Loss)梯度下降法梯…

我们都想要一个好的前景

大家好&#xff0c;我是记得诚。 有个读者向我咨询了一下他的就业问题。 问题&#xff1a; 大佬好&#xff0c;我咨询一下就业方向问题。我本身是大专毕业的&#xff0c;专业是应用电子技术&#xff0c;学了一部分硬件知识和软件。 毕业后第一份工作是去一家比较小的医疗机…

天猫魔盒解码报错

最近有个天猫魔盒&#xff08;Tmall,MagicBox_M17,MagicBox_M17&#xff09;有报错&#xff0c;报错信息如下&#xff1a; generic_decoder.cc, (line 98): Too many frames backed up in the decoder, dropping frame with timestamp 4219980314https://chromium.googlesourc…

工人安全绳穿戴识别系统---豌豆云

工人安全绳穿戴识别系统采用视频图像自动识别的形式&#xff0c;豌豆云工人安全绳穿戴识别系统通过安装在作业区域的监控摄像头。 一旦发现工人高空作业未佩戴安全带的情况&#xff0c;系统可以立即发出告警&#xff0c;相关人员可以迅速采取措施&#xff0c;防止事故的发生。…

记一次多线程写入文件出现IOException:Stream Closed的问题

背景 网关在解析1000个05文件&#xff08;txt&#xff09;写入到SFTP文件时&#xff0c;是每次读取1000 * 5条数据&#xff0c;然后每1000笔数据创建一个线程逐条数据进行字段数值映射转换&#xff0c;一共创建5个线程扔到线程池进行处理。每条数据解析完都会将数据写入到SFTP的…

绪论——算法设计原则【数据科学与工程算法基础】

一、题记 最近情绪不太稳定&#xff0c;些许烦躁&#xff0c;也就一直没践行前边说的“学习记录”的想法。现在开始做了&#xff0c;春华易逝&#xff0c;正当时&#xff0c;有想法就去做&#xff0c;踌躇懊悔是这个年纪最不该做的事。 二、前言 之前说了分块做这个系列&#x…

101. Go单测系列1---使用monkey打桩

本文将介绍如何在单元测试中使用monkey进行打桩。 monkey支持为任意函数及方法进行打桩。 monkey介绍 monkey是一个Go单元测试中十分常用的打桩工具&#xff0c;它在运行时通过汇编语言重写可执行文件&#xff0c;将目标函数或方法的实现跳转到桩实现&#xff0c;其原理类似…

我用 Python 做了个小仙女代码蹦迪视频

前言 最近在B站上看到一个漂亮的仙女姐姐跳舞视频&#xff0c;循环看了亿遍又亿遍&#xff0c;久久不能离开&#xff01; 看着仙紫小姐姐的蹦迪视频&#xff0c;除了一键三连还能做什么&#xff1f;突发奇想&#xff0c;能不能把小仙女的蹦迪视频转成代码舞呢&#xff1f; 说…

uniapp引入jQuery

安装 npm install jquery --saveoryarn add jquery引入 import Vue from vue import jquery from "jquery"; Vue.prototype.$ jquery;<template><view>abc</view> </template><script>export default {data() {return {}}} </scr…

Vue3全家桶 - VueRouter - 【1】快速使用(创建路由模块 + 规定路由模式 + 使用路由规则 + RouterView-RouterLink)

VueRouter Vue-Router官网&#xff1b;vue-router 是 vue.js 官方给出的路由解决方案&#xff0c;能够轻松的管理 SPA 项目中组件的切换&#xff1b;安装&#xff1a;yarn add vue-router4&#xff1b; 快速使用 1.1 创建路由模块 在项目中的 src 文件夹中创建一个 router …

【智慧公寓】东胜物联嵌入式硬件解决方案,为智慧公寓解决方案商降本增效,更快实现产品规模化生产

方案背景 东胜物联本次服务的客户是一家专注于提供智慧公寓解决方案的欧洲企业&#xff0c;该公司旨在为用户提供智能&#xff0c;便捷&#xff0c;安全的生活体验。其解决方案涵盖智慧公寓控制、自动化、能源管理和智能建筑&#xff0c;它的使命是通过复杂的控制系统使用户能…

【OpenGL实现 03】纹理贴图原理和实现

目录 一、说明二、纹理贴图原理2.1 纹理融合原理2.2 UV坐标原理 三、生成纹理对象3.1 需要在VAO上绑定纹理坐标3.2 纹理传递3.3 纹理buffer生成 四、代码实现&#xff1a;五、着色器4.1 片段4.2 顶点 五、后记 一、说明 本篇叙述在画出图元的时候&#xff0c;如何贴图纹理图片…