滑动窗口篇——如行云流水般的高效解法与智能之道(1)

前言:

上篇我们介绍了双指针算法,并结合具体题目进行了详细的运用讲解。本篇我们将会了解滑动窗口。滑动窗口是一种常用的算法技巧,主要用于处理子数组、子串等具有“窗口”特性的题目。柳暗花明,乃巧解复杂问题的高效之道。

一. 长度最小的子数组

题目链接:209. 长度最小的子数组 - 力扣(LeetCode)

题目分析:

1. 题目要求寻找一个子数组,数组内所有元素相加之和大于等于target,且要求该子数组的长度最小

2. 如果找到则返回最小子数组的长度,如果没有找到则返回0

注意:题目中所给的数组内所有元素均为正整数,且target也为正整数!!! 

思路讲解:

暴力解法(会超时):

「从前往后」枚举数组中的任意⼀个元素,把它当成起始位置。然后从这个「起始位置」开始,然
后寻找⼀段最短的区间,使得这段区间的和「⼤于等于」⽬标值。
将所有元素作为起始位置所得的结果中,找到「最⼩值」即可。

滑动窗口:

暴力解法超时的原因为进行了大量冗余的遍历。

我们需要明白,由于所有的元素均为正整数,当子数组的区间长度在原有基础下增大时,和必然增大,反之,则必然减小,即子数组区间和的大小与区间长度存在单调性。

假设 target = 7, nums = [2, 3, 1, 2, 4, 3]:

初始状态:left = 0, right = 0, sum = 2,窗口未达到 target。
入窗口:将 right 向右移动,直到窗口和 sum = 9,满足条件。
出窗口:移动 left,将子数组 [4, 3] 缩小到长度 2。

因此,其解法可总结为入窗口,出窗口,更新情况三大步骤。

如图:

代码实现:

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int sum=0;//子数组的和int n=nums.size(),ret=INT_MAX;//由于是求最小值,因此可首先假定其为int的最大值for(int left=0,right=0;right<n;right++){sum+=nums[right];//进窗口while(sum>=target){ret=min(ret,right-left+1);sum-=nums[left++];}//出窗口,更新ret,为下一轮遍历做准备}return ret==INT_MAX?0:ret;}
};

优势分析:

1. 时间复杂度为O(n),远远优于暴力解法

2. 在处理重复遍历问题时,我们直接采取改变窗口区间长度的方式,利用先前分析过的单调性,以left和right对其进行控制,使效率大大提高。

二.  无重复字符的最长子串

题目链接:3. 无重复字符的最长子串 - 力扣(LeetCode)

题目分析:

1. 题目要求找出一个无重复长度的子串,且该子串要求长度最长。

2. 子串的含义同子数组类似,一定要求连续,最大可为字符串本身。

思路讲解: 

暴力解法(不会超时,可以通过):

枚举「从每⼀个位置」开始往后,⽆重复字符的⼦串可以到达什么位置。找出其中⻓度最⼤的。
可在往后寻找⽆重复⼦串能到达的位置时,利⽤「哈希表」统计出字符出现的频次,来判断什么时候⼦串出现了重复元素。

代码实现:

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;}
};

 滑动窗口:

研究的对象子串仍旧是一段连续的区间,因此可以考虑使用滑动窗口来解决。

1. 我们可以使用哈希来进行字符的映射,由于窗口内所有元素都是不重复的,因此我们可以让右端元素进入窗口,并记录其字符出现频次。

2. 当字符出现频次不全为0时,即代表出现了重复元素,需要让左侧元素逐次出窗口,直至恢复频次全为0为止。

3. 当完全遍历后,此时窗口长度即为最长字串的长度。

代码实现:

class Solution {
public:int lengthOfLongestSubstring(string s) {int hash[128]={0};//模拟哈希表int n=s.size();int ret=0;for(int left=0,right=0;right<n;right++){hash[s[right]]++;//入窗口while(hash[s[right]]>1){hash[s[left++]]--;//出窗口}ret=max(ret,right-left+1);//更新子串长度}return ret;}
};

 三. 最大连续1的个数lll

题目链接:1004. 最大连续1的个数 III - 力扣(LeetCode)

题目分析:

1. 给定一个元素为1或0的数组,以及一个正整数K,可以在K的范围内把0变为1,求最长连续区间内均为1的长度。

2. 问题可转化为,求一段最长的连续区间,区间内0的个数在K范围内。

思路讲解:

滑动窗口:

此题仍为求一段连续区间的长度,因此也可以用滑动窗口来解决。

 1. 利用zere记录区间内0的个数,当zero小于K时,即可令右端元素进窗口

 2. 当zero>K时,需要令左端元素出窗口,如果左端元素为0,则令zero-1,直至zero<K为止。

3. 当完全遍历后,窗口长度即为最大连续区间的长度。 

代码实现:

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int zero=0;//记录0的个数int n=nums.size(),ret=0;for(int left=0,right=0;right<n;right++){if(nums[right]==0){zero++;}//记录0的增长情况while(zero>k){if(nums[left++]==0){zero--;}}//出窗口ret=max(ret,right-left+1);//更新窗口长度}return ret;}
};

小结:本篇介绍了滑动窗口的含义并结合基础题型加以讲解练习,下篇讲为大家分享滑动窗口的进阶题目,欢迎各位佬前来支持斧正!!! 

 

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

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

相关文章

网络安全-企业环境渗透2-wordpress任意文件读FFmpeg任意文件读

一、 实验名称 企业环境渗透2 二、 实验目的 【实验描述】 操作机的操作系统是kali 进入系统后默认是命令行界面 输入startx命令即可打开图形界面。 所有需要用到的信息和工具都放在了/home/Hack 目录下。 本实验的任务是通过外网的两个主机通过代理渗透到内网的两个主机。…

DB-GPT V0.6.2 版本更新:牵手libro社区、GraphRAG图谱构建能力增强等

DB-GPT V0.6.2版本现已上线&#xff0c;快速预览新特性&#xff1a; 新特性 1、DB-GPT 社区和 libro 社区共同发布 AWEL Notebook 功能 libro&#xff1a;灵活定制、轻松集成的 Notebook 产品方案。 社区地址&#xff1a;https://github.com/difizen/libro 使用教程&#xf…

GPT1.0 和 GPT2.0 的联系与区别

随着自然语言处理技术的飞速发展&#xff0c;OpenAI 提出的 GPT 系列模型成为了生成式预训练模型的代表。作为 GPT 系列的两代代表&#xff0c;GPT-1 和 GPT-2 虽然在架构上有着继承关系&#xff0c;但在设计理念和性能上有显著的改进。本文将从模型架构、参数规模、训练数据和…

本地部署与外部部署有何不同?

什么是本地部署&#xff1f; 本地部署&#xff08;通常缩写为“on-prem”&#xff09;是指在公司自己的设施或数据中心内托管的软件和基础设施。与基于云的解决方案不同&#xff0c;本地部署系统让企业对其数据、硬件和软件配置拥有完全的控制权。这种设置非常适合那些优先考虑…

游戏引擎学习第20天

解释 off-by-one 错误 从演讲者的视角&#xff1a;对代码问题的剖析与修复过程 问题的起因 演讲者提到&#xff0c;他可能无意中在代码中造成了一个错误&#xff0c;这与“调试时间标记索引”有关。他发现了一个逻辑问题&#xff0c;即在检查数组边界时&#xff0c;使用了“调试…

Android-如何实现Apng动画播放

01 Apng是什么 Apng&#xff08;Animated Portable Network Graphics&#xff09;顾名思义是基于 PNG 格式扩展的一种动画格式&#xff0c;增加了对动画图像的支持&#xff0c;同时加入了 24 位图像和8位 Alpha 透明度的支持&#xff0c;并且向下兼容 PNG。 Google封面图 02 A…

Linux下Intel编译器oneAPI安装和链接MKL库编译

参考: https://blog.csdn.net/qq_44263574/article/details/123582481 官网下载: https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit-download.html?packagesoneapi-toolkit&oneapi-toolkit-oslinux&oneapi-linoffline 填写邮件和国家,…

【Python系列】浅析 Python 中的字典更新与应用场景

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Matlab科研绘图:自定义内置多款配色函数

在Matlab科研绘图中&#xff0c;自定义和使用内置的多款配色函数可以极大地增强图表的视觉效果和数据的可读性。本文将介绍配色函数&#xff0c;共计带来6套配色体系&#xff0c;而且后续可以根据需要修改&#xff0c;帮助大家自定义和使用配色函数。 1.配色函数 可以根据个…

网络安全的学习方向和路线是怎么样的?

最近有同学问我&#xff0c;网络安全的学习路线是怎么样的&#xff1f; 废话不多说&#xff0c;先上一张图镇楼&#xff0c;看看网络安全有哪些方向&#xff0c;它们之间有什么关系和区别&#xff0c;各自需要学习哪些东西。 在这个圈子技术门类中&#xff0c;工作岗位主要有以…

JAVA八股与代码实践----JDK代理和CGLIB代理的区别

当spring发现该代理的类实现了接口会使用JDK代理&#xff0c;如果该类没有实现接口&#xff0c;会使用CGLIB代理 如果在springboot中要强制使用CGLIB代理&#xff0c;需要加上 EnableAspectJAutoProxy(proxyTargetClass true) // 强制使用 CGLIB SpringBootApplication Ena…

环境背景文本到语音转换

目录 概述演示效果核心逻辑使用方式 概述 本文所涉及的所有资源的获取方式&#xff1a;https://www.aspiringcode.com/content?id100000000027&uid2f1061526e3a4548ab2e111ad079ea8c 论文标题&#xff1a; 本文提出了 VoiceLDM&#xff0c;这是一种旨在生成准确遵循两种…

mac安装Pytest、Allure、brew

安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令&#xff1a;brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…

【Linux】重定向,dup

目录 文件描述符分配规则 重定向 dup ​编辑 输出重定向 追加重定向 输入重定向。 重定向会影响后面的程序替换吗&#xff1f; 1号文件和2号文件 2号文件输出重定向 下标之间的重定向 文件描述符分配规则 重定向 把显示器文件关闭后&#xff0c;本来应该写给显示器…

Vue实训---1-创建Vue3项目

1.创建项目&#xff08;项目名为my-vue-project&#xff09; npm create vitelatest my-vue-project -- --template vue 运行命令npm -v&#xff0c;查看npm版本号&#xff0c;如果是npm 7或更高版本运行以上命令即可。如果是npm 6或更低版本&#xff0c;使用npm create vite…

智慧社区方案提升居民生活质量与管理效率的创新实践

内容概要 智慧社区方案的背景与发展趋势指向了一个日益重要的方向&#xff0c;随着城市化进程的加快&#xff0c;传统的社区管理模式逐渐显得力不从心。在这个时候&#xff0c;智慧社区应运而生&#xff0c;它通过将现代信息技术与社区管理深度结合&#xff0c;为提升居民生活…

【IDER、PyCharm】免费AI编程工具完整教程:ChatGPT Free - Support Key call AI GPT-o1 Claude3.5

文章目录 CodeMoss 简介CodeMoss 的模型集成如何安装和配置 CodeMossIDER 插件安装步骤 CodeMoss 的实战使用AI 问答功能代码优化与解释优化这段代码解释这段代码 文件上传与对话联网查询与 GPT 助手联网查询GPT 助手 提升开发效率的最佳实践结语更多文献 CodeMoss 简介 CodeM…

Java安全—JNDI注入RMI服务LDAP服务JDK绕过

前言 上次讲到JNDI注入这个玩意&#xff0c;但是没有细讲&#xff0c;现在就给它详细地讲个明白。 JNDI注入 那什么是JNDI注入呢&#xff0c;JNDI全称为 Java Naming and Directory Interface&#xff08;Java命名和目录接口&#xff09;&#xff0c;是一组应用程序接口&…

HarmonyOS笔记5:ArkUI框架的Navigation导航组件

ArkUI框架的Navigation导航组件 在移动应用中需要在不同的页面进行切换跳转。这种切换和跳转有两种方式&#xff1a;页面路由和Navigation组件实现导航。HarmonyOS推荐使用Navigation实现页面跳转。在本文中在HarmonyOS 5.0.0 Release SDK (API Version 12 Release)版本下&…

YOLOv11来了,使用YOLOv11训练自己的数据集和预测 (保姆级无代码操作版)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言性能表现数据集准备1.数据标注2.数据标签转换 YOLO模型训练教程1.模型安装2.YOLO11 模型训练3.YOLO11 预测结果 总结 前言 YOLOv11是由Ultralytics团队于2024年…