当前位置: 首页 > news >正文

一文带你学会使用滑动窗口


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

🔥个人主页guoguoqiang. 🔥专栏leetcode刷题

Alt

209.长度最小的子数组

在这里插入图片描述
求最短长度之和等于目标值。
方法一: 暴力枚举(会超时)
从头开始遍历直到之和等于target然后更新结果。这里就不写代码了。
方法二: 滑动窗口

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n=nums.size(),sum=0,len=INT_MAX;for(int left=0,right=0;right<n;right++){sum+=nums[right];//入窗口while(sum>=target){//判断 题目要求就为sum大于等于target然后长度最小len=min(len,right-left+1);//更新结果sum-=nums[left++];//出窗口}}return len==INT_MAX?0:len;//如果它还未更新就说明和没有大于target否则就更新了len。}
};

3.无重复字符的最长字串

在这里插入图片描述
可以看出这道题目全是字母,可以通过数组来模拟哈希表
方法一:哈希表+暴力枚举
每有一个就入哈希表,然后就判断是否重复,然后更新结果。循环结束最后的len即为结果

class Solution {
public:int lengthOfLongestSubstring(string s) {int ret = 0; // 记录结果int n = s.length();// 1. 枚举从不同位置开始的最⻓重复⼦串// 枚举起始位置for (int i = 0; i < n; i++) { // 创建⼀个哈希表,统计频次int hash[128] = {0};// 寻找结束为⽌for (int j = i; j < n; j++) {hash[s[j]]++;       // 统计字符出现的频次if (hash[s[j]] > 1) // 如果出现重复的break;// 如果没有重复,就更新 retret = max(ret, j - i + 1);}}// 2. 返回结果return ret;}
};

方法二:
通过哈希表+滑动窗口

class Solution {
public:int lengthOfLongestSubstring(string s) {int hash[128]={0};int left=0,right=0,n=s.size();int ret=0;while(right<n){//遍历字符串hash[s[right]]++;//进窗口while(hash[s[right]]>1)//判断是否出现重复字符串hash[s[left++]]--;//将这个左对应的元素出窗口ret=max(ret,right-left+1);//更新结果求最长长度right++;//让下一个元素进窗口}return ret;}
};

1004. 最大连续1的个数 III

在这里插入图片描述
利用滑动窗口来:
这个题就是记录最大连续1的个数,然后用一个变量来记录0的个数如果大于k就将左侧的元素出窗口直到zero<k;然后更新结果

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int ret=0;for(int left=0,right=0,zero=0;right<nums.size();right++){if(nums[right]==0) zero++;//记录0的个数while(zero>k){//如果0的个数大于kif(nums[left++]==0) zero--;//就判断left位置是否为0(为0就跳出窗口),不为0就遍历下一个}ret=max(ret,right-left+1);//更新结果}return ret;}
};

1658.将x减到0的最小操作数

在这里插入图片描述
方法: 滑动窗口
这个相减为最小生成数,然后可以改为中间部分的和为sum-x求长度最长,数组长度-len即为外部相减为0的最短长度。

class Solution {
public:int minOperations(vector<int>& nums, int x) {int sum=0;for(auto num:nums) sum+=num;//求全部的和int target=sum-x;//为中间区域的和,这个就可以改为之前的那个最长长度和为targetif(target<0) return -1;int ret=-1;for(int left=0,right=0,tmp=0;right<nums.size();right++){tmp+=nums[right];//入窗口while(tmp>target){//判断是否大于targettmp-=nums[left++];//出窗口}if(tmp==target)//如果和等于targetret=max(ret,right-left+1);//更新结果}if(ret==-1) return ret;//说明没找到else return nums.size()-ret;//就返回n-ret的即为能减为0的最短长度}
};

904.水果成篮

在这里插入图片描述
在这里插入图片描述

这个题目可以理解为最多只能能摘两种水果,但是不限制数量,所以需要求可以摘的水果的最大数量。
方法: 通过哈希表+滑动窗口来实现

class Solution {
public:int totalFruit(vector<int>& f) {unordered_map<int,int> hash;//创建哈希表int ret=0;for(int left=0,right=0;right<f.size();right++){hash[f[right]]++;//入窗口while(hash.size()>2){//如果种类大于两种,就从左面出窗口,直到种类等于两种hash[f[left]]--;if(hash[f[left]]==0) hash.erase(f[left]);//如果这个种类数量等于零就从哈希表中删除left++;}ret=max(ret,right-left+1);//更新结果}return  ret;}
};

通过观察这个题的数字范围是1到100000 ,可以通过创建一个数组来代替哈希表实现

class Solution {
public:int totalFruit(vector<int>& fruits) {int hash[100001]={0};//哈希表int n=fruits.size();int ret=0;for(int left=0,right=0,kinds=0;right<n;right++){if(hash[fruits[right]]==0) kinds++;//如果这个元素为0说明是新种类,kinds++hash[fruits[right]]++;//进窗口while(kinds>2){hash[fruits[left]]--;//出窗口if(hash[fruits[left]]==0) kinds--;//如果这个值变为零,就需要将种类--;left++;//left++遍历下一个left对应元素,直到种类等于2}ret=max(ret,right-left+1);//更新结果}return ret;}
};

438.找到字符串中所有字母异位词

在这里插入图片描述
方法一:暴力枚举+哈希表
就是遍历整个s然后找出等于hash表中p的单词然后就记录到结果中
方法二:滑动窗口+哈希表

class Solution {
public:vector<int> findAnagrams(string s, string p) {vector<int> ret;int hash1[26]={0};for(auto ch:p) hash1[ch-'a']++;//记录p中的字母int hash2[26]={0};int m=p.size();//记录p中的个数for(int left=0,right=0,count=0;right<s.size();right++){char in=s[right];if(++hash2[in-'a']<=hash1[in-'a']) count++;//判断进窗口的元素是否为有效元素if(right-left+1>m){//长度大于m出窗口char out=s[left++];if(hash2[out-'a']--<=hash1[out-'a']) count--;//判断是否为有效元素然后出窗口更新}if(count==m) ret.push_back(left);//更新结果}return ret;}
};

这个题目的范围只包括小写字母,就可以通过一个int数组来代替哈希表。

30.串联所有单词的字符

在这里插入图片描述
这个题目说明可以看例子了解:
就是将words中的字符可以全排列找到,然后返回首元素在s中出现的下标位置。

方法一:暴力枚举+哈希表(会超时)
先将words中的元素进哈希表,hash<string,int>统计words中的元素。
然后for循环遍历字符串,判断是否为串联子串。
方法二: 滑动窗口+哈希表
在暴力枚举中是一个单位一个单位进行移动,在这个题中就显得不是很合适,这个我们可以把后面words中的word看作一个单位,按这个单位长度进行移动。这样我们这个题就可以看作找到字符串中所有字母的异位词。
我们需要注意 窗口执行的次数。

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {vector<int> ret;unordered_map<string,int> hash1 ;//将所有的words进入哈希表for(auto& word:words) hash1[word]++;int size=words.size();//记录words中的元素个数int len=words[0].size();//记录words中的单个元素长度for(int i=0;i<len;i++){//执行len次 因为次数多了有重复遍历unordered_map<string,int>hash2;for(int left=i,right=i,count=0;right+len<=s.size();right+=len){//一次跳过长度个长度string in=s.substr(right,len);hash2[in]++;//记录s中的单词if(hash1.count(in)&&hash2[in]<=hash1[in])count++;//如果words中存在则进行判断s中出现的次数是不是小于等于words中的if(right-left+1>size*len){//长度超了需要出窗口string out=s.substr(left,len);if(hash1.count(out)&&hash2[out]<=hash1[out]) count--;//出窗口并记录counthash2[out]--;//将这个元素从哈希表中出去left+=len;//一次len个单位长度}if(count==size) ret.push_back(left);//更新结果}}return ret;}
};

相关文章:

一文带你学会使用滑动窗口

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;leetcode刷题 ​ ​ 209.长度最小的子数组 求最短长度之和等于目标值。 方法一&#xff1a; 暴力枚举&#xff08;会超时&#xff09; 从头开始遍历直到之和等于target然后更新结果。这…...

如何从0到1本地搭建whisper语音识别模型

文章目录 环境准备1. 系统要求2. 安装依赖项1:安装 Python 和虚拟环境2:安装 Whisper3:下载 Whisper 模型4:进行语音识别5:提高效率和精度6:开发和集成Whisper 是 OpenAI 发布的一个强大的语音识别模型,它可以将语音转换为文本,支持多语言输入,并且可以处理各种音频类…...

PyTorch 创建数据集

图片数据和标签数据准备 1.本文所用图片数据在同级文件夹中 ,文件路径为train/’ 2.标签数据在同级文件&#xff0c;文件路径为train.csv 3。将标签数据提取 train_csvpd.read_csv(train.csv)创建继承类 第一步&#xff0c;首先创建数据类对象 此时可以想象为单个数据单元的…...

[Java]SpringBoot登录认证流程详解

登录认证 登录接口 1.查看原型 2.查看接口 3.思路分析 登录核心就是根据用户名和密码查询用户信息,存在则登录成功, 不存在则登录失败 4.Controller Slf4j RestController public class LoginController {Autowiredprivate EmpService empService;/*** 登录的方法** param …...

【Day08】

目录 MySQL-多表查询-概述 MySQL-多表查询-内连接 MySQL-多表查询-外连接 MySQL-多表查询-[标量、列]子查询 MySQL-多表查询-[行、表]子查询 MySQL-多表查询-案例 MySQL-事务-介绍与操作 MySQL-事务-四大特性 MySQL-索引-介绍 MySQL-索引-结构 MySQL-索引-操作语法 …...

mongodb在Java中条件分组聚合查询并且分页(时间戳,按日期分组,年月日...)

废话不多说&#xff0c;先看效果图&#xff1a; SQL查询结果示例&#xff1a; 多种查询结果示例&#xff1a; 原SQL&#xff1a; db.getCollection("hbdd_order").aggregate([{// 把时间戳格式化$addFields: {orderDate: {"$dateToString": {"for…...

怎么样处理浮毛快捷又高效?霍尼韦尔、希喂、米家宠物空气净化器实测对比

掉毛多&#xff1f;掉毛快&#xff1f;猫毛满天飞对身体有危害吗&#xff1f;多猫家庭经验分享篇&#xff1a; 一个很有趣的现象&#xff0c;很多人在养猫、养狗后耐心都变得更好了。养狗每天得遛&#xff0c;养猫出门前得除毛&#xff0c;日复一日的重复磨练了极好的耐心。我家…...

什么是WebGL技术?有什么特点?应用领域有哪些?

WebGL&#xff08;Web Graphics Library&#xff09;技术是一种在Web浏览器中渲染交互式3D和2D图形的JavaScript API。以下是对WebGL技术的详细解析&#xff1a; 一、定义与起源 定义&#xff1a; WebGL全称Web Graphics Library&#xff0c;即网络图形库&#xff0c;它允许…...

500W逆变器(一)

EG8015_24V_500W 这款逆变器是基于 EG8015 SPWM 专用芯片而设计的方案。其额定的输出功率为 500 瓦, 最大输出功率为 600 瓦&#xff0c;输出电压为 220V10%&#xff0c;输出频率为 50Hz0.1Hz&#xff0c;额定输出电流为 2.3 安培。 穿越机降落的时候不要垂直降落&#xff0c;要…...

ubuntu 22.04 编译安装新内核

1、普通用户登录系统 查看当前内核版本 $ uname -r 5.15.0-118-generic 2、下载内核源码 www.kernel.org 用户home目录新建子目录linux&#xff0c;下载并解压 linux-5.15.165.tar.xz 3、创建起始的配置文件.config Configuration targets &#xff08;见linux kernel i…...

Linux 文件权限与属性管理

概述 Linux 系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c;Linux 对不同用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了详细的规定。 文件属性查看 在 Linux 中&#xff0…...

Django学习实战篇三(适合略有基础的新手小白学习)(从0开发项目)

前言&#xff1a; 在上一章中&#xff0c;我们对Django的Model层有了比较全面的认识&#xff0c;本章就来配置Django自带的admin。这里需要认识到&#xff0c;Django的Model层是很重要的一环&#xff0c;无论是对于框架本身还是对于基于Django框架开发的大多数系统而言。因为一…...

【SPIE独立出版,连续2届稳定EI检索!】2024年第三届信息学,网络与计算技术国际学术会议(ICINC2024,10月25-27)

2024年第三届信息学&#xff0c;网络与计算技术国际学术会议(ICINC2024)将于2024年10月25-27日于中国郑州召开。 会议将围绕信息技术与通信&#xff0c;网络与计算技术等在相关领域中的最新研究成果&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者…...

.NET/C#⾯试题汇总系列:基础语法

1. 字符串中string strnull和string str""和string strstring.Empty的区别&#xff1f; string str null;&#xff1a;这种方式声明了一个字符串变量str&#xff0c;并将其初始化为null。这意味着str不指向任何实际的字符串对象。如果你试图访问str的属性或方法&…...

【论文阅读】SwiftTheft: A Time-Efficient Model Extraction Attack Framework(2024)

完整标题 SwiftTheft: A Time-Efficient Model Extraction Attack Framework Against Cloud-Based Deep Neural Networks 摘要 With the rise of artificial intelligence(人工智能) and cloud computing(云计算), machine-learning-as-a-service platforms(机器学习即…...

springcloud间通信的方式

在 Spring Cloud 中&#xff0c;主要有以下几种通信方式&#xff1a; 一、基于 HTTP 的 RESTful API 工作原理&#xff1a; 这是一种常见的通信方式&#xff0c;各个微服务通过发送 HTTP 请求来相互调用。服务提供者暴露 RESTful API 接口&#xff0c;服务消费者通过 HTTP 客户…...

【C++ Qt day9】

2、将day1做的登录界面升级优化【资源文件的添加】 3、 使用手动连接&#xff0c;将登录框中的取消按钮使用第2种方式的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上…...

中国传媒业人工智能应用发展图谱2024

易观分析&#xff1a;传媒产业是指以传播各类信息、知识为核心&#xff0c;通过多种媒介形式进行内容生产、发布和分发的综合性产业。技术的进步和应用对于传媒产业发展变革起到了核心驱动力的作用&#xff0c;2022年生成式AI进入应用爆发期&#xff0c;不仅带动了人工智能产业…...

RTX3060 FP64测试与猜想

RTX3060 FP64测试与猜想 一.小结二.查看FP64的峰值性能三.打满FP64、FP32的利用率,对比差异四.进一步证明pipe_fp64_cycles_active并不是2个fp64 core的metrics RTX3060 FP64测试与猜想 一.小结 RTX3060 compute capability为8.6,每个SM有2个FP64 core。每个cycle可输出2个fp…...

uniapp写移动端常见问题汇总

1. 手机顶部状态栏遮挡 写在需要的地方 <view class"status_bar" style"height: var(--status-bar-height); width: 100%;">2. 手机顶部状态栏字体颜色 // pages.json "statusBarStyle": "light",3. 背景覆盖全屏 page{widt…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...