【算法笔记】滑动窗口算法原理深度剖析
【算法笔记】滑动窗口算法原理深度剖析

🔥个人主页:大白的编程日记
🔥专栏:算法笔记

文章目录
- 【算法笔记】滑动窗口算法原理深度剖析
- 前言
- 一.长度最小的子数组
- 1.1题目
- 1.2思路分析
- 1.3算法流程
- 1.4正确性证明
- 1.5代码实现
- 二.无重复字符的最长字串
- 2.1题目
- 2.2思路分析
- 2.3代码实现
- 三.水果成蓝
- 3.1题目
- 3.2思路分析
- 3.3代码实现
- 四.找到字符串中所有字母异位词
- 4.1题目
- 4.2思路分析
- 4.3代码实现
- 五.串联所有单词的子串
- 5.1题目
- 5.2思路分析
- 5.3代码实现
- 算法总结
- 后言
前言
哈喽,各位小伙伴大家好!上期我们讲了双指针算法原理,今天我们继续讲解滑动窗口算法原理。话不多说,咱们进入正题!向大厂冲锋!
一.长度最小的子数组
1.1题目
- 题目:长度最小的子数组

1.2思路分析
这里我们根据暴力算法借助单调性优化,利用滑动窗口解决问题。

1.3算法流程

1.4正确性证明

1.5代码实现
这里当right越界时说明我们枚举了所有情况,直接返回结果即可。
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums){int Min=INT_MAX;int sum=0;for(int left=0,right=0;right<nums.size();right++){sum+=nums[right];//进窗口while(sum>=target){Min=min(Min,right-left+1);//更新结果sum-=nums[left++];//出窗口}}return Min==INT_MAX?0:Min;}
};

二.无重复字符的最长字串
2.1题目
- 题目:无重复字符的最长字串

2.2思路分析

2.3代码实现
这里我们用字符数组存储字符信息方便我们判断我们。
class Solution {
public:int lengthOfLongestSubstring(string s) {int hash[128]={0};//存储字符信息int ret=INT_MIN;int left,right,n=s.size();·left=right=0;while(right<n){hash[s[right]]++;//进窗口while(hash[s[right]]>1){hash[s[left++]]--;//出窗口}ret=max(ret,right-left+1);//更新结果right++;}return ret==INT_MIN?0:ret;}
};

三.水果成蓝
3.1题目
- 题目:水果成蓝

3.2思路分析

3.3代码实现
class Solution {
public:int totalFruit(vector<int>& fruits) {int hash[100001]={0};//存储水果种类个数int ans=INT_MIN;for(int left=0,right=0,k=0,n=fruits.size();right<n;right++){if(hash[fruits[right]]==0)//进窗口{k++;//种类增加}hash[fruits[right]]++;//记录个数while(k>2){hash[fruits[left]]--;if(hash[fruits[left]]==0)//种类减少{k--;}left++;//出窗口}ans=max(ans,right-left+1);//更新结果}return ans;}
};

四.找到字符串中所有字母异位词
4.1题目
- 题目:找到字符串中所有字母异位词

4.2思路分析

4.3代码实现
class Solution {
public:vector<int> findAnagrams(string s, string p) {vector<int> ret;int hash1[26]={0};int hash2[26]={0};for(auto a:p){hash1[a-'a']++;}int count=0;//记录有效字符个数for(int left=0,right=0,n=s.size();right<n;right++){char in=s[right];//进窗口if(++hash2[in-'a']<=hash1[in-'a']){count++;//有效字符增加}if(right-left+1>p.size()){char out=s[left++];//出窗口if(hash2[out-'a']--<=hash1[out-'a']){count--;//有效字符减少}}if(count==p.size()){ret.push_back(left);//保存结果}}return ret;}
};

五.串联所有单词的子串
5.1题目
- 题目:串联所有单词的子串

5.2思路分析

5.3代码实现
class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {unordered_map <string ,int> hash1;//字符串哈希表vector<int> ret;for(auto a:words){hash1[a]++;//填充哈希表存储单词个数}int len=words[0].size(),n=words.size();for(int i=0;i<len;i++){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]++;//填充哈希if(hash1.count(in)&&hash2[in]<=hash1[in])//判断是否有效字符串{count++;//更新有效单词个数}if(right-left+1>len*n)//出窗口{string out=s.substr(left,len);if(hash1.count(out)&&hash2[out]<=hash1[out])//判断是否有效字符串{count--;//更新有效单词个数}hash2[out]--;//更新哈希left+=len;}if(count==n){ret.push_back(left);//更新结果}}}return ret;}
};

算法总结
滑动窗口就是根据题目信息,在暴力枚举的条件下利用单调性优化,用同向双指针快速筛选掉一些不必要的遍历情况。在O(N)的复杂度下完成所有情况的枚举从而解题的算法。
后言
这就是滑动窗口算法原理的深度剖析。总而言之,滑动窗口就是在暴力枚举的情况下利用单调性,使用同向双指针在O(N)的复杂度完成枚举的算法。算法流程并不重要,重要的是背后的算法原理推到和证明。大家自己下去好好消化。今天就分享到,感谢各位的耐心垂阅!咱们下一期见!拜拜~

相关文章:
【算法笔记】滑动窗口算法原理深度剖析
【算法笔记】滑动窗口算法原理深度剖析 🔥个人主页:大白的编程日记 🔥专栏:算法笔记 文章目录 【算法笔记】滑动窗口算法原理深度剖析前言一.长度最小的子数组1.1题目1.2思路分析1.3算法流程1.4正确性证明1.5代码实现 二.无重复…...
4S店4S店客户管理系统小程序(lw+演示+源码+运行)
社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非…...
rabbitMq------连接管理模块
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言管理的字段连接内存管理对象 前言 我们的网络通信框架使用的muduo库,而在mudu库中是已经有了连接的概念,但是我们呢还有一个信道的概念…...
【部署项目】禹神:前端项目部署上线笔记
1.项目打包 ● 我们开发用的脚手架其实就是一个微型服务器,用于:支撑开发环境、运行代理服务器等。 ● 打包完的文件中不存在:.vue、.jsx、.less 等文件,而是:html、css、js等。 ● 打包后的文件,不再借助…...
力扣10.1
983. 最低票价 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。 火车票有 三种不同的销售方式 : 一张 为期一天 的通行证售…...
TypeScript 算法手册 - 【冒泡排序】
文章目录 TypeScript 算法手册 - 冒泡排序1. 冒泡排序简介1.1 冒泡排序定义1.2 冒泡排序特点 2. 冒泡排序步骤过程拆解2.1 比较相邻元素2.2 交换元素2.3 重复过程 3. 冒泡排序的优化3.1 提前退出3.2 记录最后交换位置案例代码和动态图 4. 冒泡排序的优点5. 冒泡排序的缺点总结 …...
计算机网络——http和web
无状态服务器——不维护客户端 怎么变成有状态连接 所以此时本地建立代理—— 若本地缓存了——但是服务器变了——怎么办?...
使用 Light Chaser 进行大屏数据可视化
引言 在当今数据驱动的世界中,数据可视化变得越来越重要。Light Chaser 是一款基于 React 技术栈的大屏数据可视化设计工具,通过简单的拖拽操作,你可以快速生成漂亮、美观的数据可视化大屏和看板。本文将介绍如何使用 Light Chaser 进行数据…...
Java中的异常概念
在Java编程中,异常(Exception)是一种特殊的情况,它在程序执行期间发生,会干扰程序正常的流程。 ## 一、异常的产生原因 1. **用户输入错误** - 例如,当一个程序期望用户输入一个整数,而用户…...
flutter_鸿蒙next_Dart基础②List
目录 代码示例 代码逐段解析 1. 创建和打印列表 2. 强类型列表 3. 创建可扩展的空列表 4. 创建填充列表 5. 列表扩展 6. 使用可选展开操作符 7. 获取列表长度 8. 列表反转 9. 添加多个元素 10. 移除元素 11. 根据索引移除元素 12. 在特定位置插入元素 13. 清空列…...
【2024保研经验帖】武汉大学测绘遥感国家重点实验室夏令营(计算机向)
前言 先说本人背景:末211,rk前5%,无科研,有几个竞赛(数模、机器人等) 武大的国重是我参加的第二个夏令营,武大国重这次有提前开几个分会场,一个在中南大学,一个在吉林大学,还有在兰…...
PyGWalker:让你的Pandas数据可视化更简单,快速创建数据可视化网站
1、PyGWalker应用: 在数据分析的过程中,数据的探索和可视化是至关重要的环节,如何高效地将分析结果展示给团队、客户,甚至是公众,是很多数据分析师和开发者面临的挑战,接下来介绍的两大工具组合——PyGWalker与Streamlit,可以帮助用户轻松解决这个问题,即使没有复杂的代…...
Ubuntu24.04远程开机
近来在几台机器上鼓捣linux桌面,顺便研究一下远程唤醒主机。 本篇介绍Ubuntu系统的远程唤醒,Windows系统的唤醒可搜索相关资料。 依赖 有远程唤醒功能的路由器(当前一般都带这个功能)有线连接主机(无线连接有兴趣朋友…...
网络编程(12)——完善粘包处理操作(id字段)
十二、day12 之前的粘包处理是基于消息头包含的消息体长度进行对应的切包操作,但并不完整。一般来说,消息头仅包含数据域的长度,但是如果要进行逻辑处理,就需要传递一个id字段表示要处理的消息id,当然可以不在包头传i…...
「3.3」虫洞 Wormholes
多组数据不清零——见祖宗 「3.3」虫洞 Wormholes 问题背景 「一本通3.3 练习2」 题目描述 John 在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John 的每…...
网页篡改防御方法
网页篡改防御方法 将服务器安全补丁升级到最新版 操作系统、应用程序、数据库等都需要使用最新的安全补丁,打补丁主要是为防止攻击者利用缓冲溢出和设计缺陷等进行攻击。 封闭未使用但已经开放的网络服务端口及未使用的服务 对于Windows Server 2003操作系统&am…...
Pikachu-Cross-Site Scripting-xss盲打
xss盲打,不是一种漏洞类型,而是一个攻击场景;在前端、或者在当前页面是看不到攻击结果;而是在后端、在别的页面才看到结果。 登陆后台,查看结果;...
JAVA思维提升案例5
抢红包案例: 要求: 一个大V直播时发起了抢红包活动,分别有:9、666、188、520、99999五个红包。 请模拟粉丝来抽奖,按照先来先得,随机抽取,抽完即止,注意:一个红包只能被…...
PostgreSQL的字符集
PostgreSQL的字符集 PostgreSQL 支持多种字符集(character sets),也称为编码(encoding)。字符集决定了数据库存储和处理文本数据的方式。在创建数据库时,可以指定数据库的字符集,或者使用默认的…...
CUDA 参考文章
CUDA:NVCC编译过程和兼容性详解_nvcc把cuda代码转换成什么-CSDN博客https://blog.csdn.net/fb_help/article/details/80462853 1、CUDA:NVCC编译过程和兼容性详解 CUDA:NVCC编译过程和兼容性详解 https://codeyarns.com/2014/03/03/how-to-sp…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

