滑动窗口(LeeCode209题,以JS为例)

什么是滑动窗口?

滑动窗口是算法中一种非常有用的技术,特别是在处理数据序列或数组时。它的核心思想是维护一个固定大小的窗口,这个窗口在数据序列上滑动,以便于在窗口内的元素上进行操作或计算。滑动窗口技术通常用于解决与数据子序列相关的问题,例如:

  1. 最大子数组和:找到数组中和最大的连续子数组。
  2. 最小覆盖子串:找到覆盖所有字符的最短子串。
  3. 最长不重复子串:找到最长的不包含重复字符的连续子串。

滑动窗口的基本操作:

  • 初始化:设置窗口的起始和结束位置,通常起始位置 start 和结束位置 end 都初始化为 0。
  • 扩展窗口:将窗口的结束位置 end 向右移动,即 end++,以包含更多的元素。
  • 收缩窗口:如果窗口的大小超出了限制,或者不再满足特定的条件(例如,需要保持窗口内元素的和不超过某个值),则将窗口的起始位置 start 向右移动,即 start++,以排除窗口左侧的元素。

滑动窗口的实现步骤:

  1. 初始化:设置窗口的起始和结束索引,以及可能需要的辅助数据结构(如哈希表、队列等)。
  2. 计算窗口值:根据问题需求,计算窗口内元素的和、最大值、最小值等。
  3. 滑动窗口:根据窗口内的条件,决定是扩展窗口还是收缩窗口。
    • 如果窗口大小未达到要求,扩展窗口。
    • 如果窗口大小达到要求但满足条件,记录结果,然后扩展窗口。
    • 如果窗口大小达到要求但不满足条件,收缩窗口。
  4. 更新结果:在每次窗口滑动后,根据问题需求更新全局结果。

示例:最长不重复子串

假设我们要找到字符串中最长的不包含重复字符的子串。使用滑动窗口的方法,我们可以这样做:

  1. 使用一个哈希表来记录窗口内字符的出现次数。
  2. 使用两个指针表示窗口的起始和结束位置。
  3. 遍历字符串,将遇到的字符加入哈希表,并扩展窗口。
  4. 如果哈希表中字符的总数超过了窗口大小,说明有重复字符,需要收缩窗口。
  5. 在每次窗口滑动后,更新最长不重复子串的长度。

滑动窗口技术是一种非常灵活的方法,可以根据不同的算法问题进行调整和优化。

示例题目

解题思路

这段代码是一个 JavaScript 函数,用于解决一个典型的滑动窗口问题:找到数组中和至少为 target 的最短子数组的长度。下面是这个函数的解题思路:

  1. 初始化变量

    • start 和 end 分别表示滑动窗口的起始和结束位置,初始时都设置为 0。
    • len 存储数组 nums 的长度。
    • res 用来存储最短子数组的长度,初始值设为 Infinity,表示无穷大,因为我们要找到最短的长度。
    • sum 用来存储当前窗口内所有元素的和,初始值为 0。
  2. 外层循环

    • 使用 while 循环,条件是 end < len,确保 end 索引不会超出数组长度。
  3. 扩展窗口

    • 在每次循环中,将 end 索引对应的元素加到 sum 上,扩展窗口。
  4. 检查窗口和

    • 使用内层 while 循环检查当前窗口的和是否大于 target
    • 如果 sum 大于 target,则需要收缩窗口。
  5. 收缩窗口

    • 如果 sum 大于 target,则更新 res 为当前窗口长度 end - start 的最小值。
    • 然后从 sum 中减去 start 索引对应的元素,并将 start 向右移动一位,从而收缩窗口。
  6. 更新结束索引

    • 无论是否收缩窗口,外层循环的每次迭代结束时,都将 end 向右移动一位。
  7. 处理边界情况

    • 在循环结束后,如果 res 仍然是 Infinity,说明没有找到任何满足条件的子数组,此时返回 0。
    • 如果找到了满足条件的子数组,返回 res 的值。
  8. 返回结果

    • 使用三元运算符检查 res 是否为 Infinity,如果是,则返回 0;否则返回 res

这个函数的时间复杂度是 O(n),其中 n 是数组 nums 的长度,因为每个元素最多被访问两次(一次添加到 sum,一次从 sum 中减去)。空间复杂度是 O(1),因为我们只使用了固定数量的额外变量。

答案:

总结

滑动窗口是一种强大的算法工具,能够以线性时间解决多种子数组相关问题,是算法竞赛和工业界中常用的技术之一

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年粤港澳青少年信息学创新大赛图形化编程小低组真题试卷

2024年粤港澳青少年信息学创新大赛图形化编程小低组真题试卷 题目总数&#xff1a;16 总分数&#xff1a;100 单选题 第 1 题 单选题 默认小猫角色&#xff0c;以下哪个Scratch程序可以在点击绿旗后让小猫说”你好!"一共10秒? A. B. C. D. 第 2 题 单选题 …

如何根据使用场景选购3D扫描仪?

三维扫描建模是指通过专业的三维扫描仪对产品进行三维数据的采集&#xff0c;快速获取物体精确的3D数据&#xff0c;实现1:1复刻原物体&#xff0c;扫描后所得的数字化3D模型以obj、fbx、glb、gltf等格式保存。 积木易搭自主研发多款三维扫描设备&#xff0c;拥有多项国家专利&…

[240617] RFC 9562-UUIDs,取代原来的 RFC 4122 | ChatGPT 导致线上自由职业者的需求大幅下降

目录 RFC 9562 - UUIDs - 2405发布&#xff0c;取代原来的 RFC 4122ChatGPT 导致线上自由职业者的需求大幅下降 RFC 9562 - UUIDs - 2405发布&#xff0c;取代原来的 RFC 4122 这份 RFC 中包含了 UUID 八个版本的 定义&#xff0c;但看点是在新引入 v6, v7, v8 详细标准文本可…

剧本杀小程序开发,线上剧本杀游戏新体验

近几年&#xff0c;剧本杀行业快速崛起&#xff0c;吸引了广大年轻人的眼光&#xff0c;成为年轻人社交娱乐的新选择。剧本杀在线上也崭露头角&#xff0c;获得大众的关注&#xff0c;性价比高的优势成为了大众玩剧本杀的首要方式。 随着互联网的快速发展&#xff0c;年轻人都…

windows11子系统Ubuntu 22.04.4子安装图形化界面

1、windows11家庭版本设置 打开虚拟机安装许可 2、Microsoft Store下载安装ubuntu 我使用的是22.04.4 LTS版本 3、 打开ubuntu 命令窗口 1、打开win11的命令行&#xff0c;在下拉三角下标&#xff0c;打开&#xff0c;可以看到有Ubuntu 的选项&#xff0c;点击即可进入linux命…

网络层只懂路由?这9个知识点被严重低估了

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 网络层想必你已经耳熟能详&#xff0c;它的作用自然是不容小觑。 它负责将数据从源头准确地投递到目的地&am…

【大语言模型】本地快速部署Ollama运行大语言模型详细流程

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

【源码】Spring事务之事务失效及原理

Spring事务 1、【源码】SpringBoot事务注册原理 2、【源码】Spring Data JPA原理解析之事务注册原理 3、【源码】Spring Data JPA原理解析之事务执行原理 4、【源码】SpringBoot编程式事务使用及执行原理 5、【源码】Spring事务之传播特性的详解 6、【源码】Spring事务之…

怎么将经典动漫秒变高清动漫?

你的记忆中是否也有一部经典的动漫、动画片。那是我们童年的美好记忆&#xff0c;但是我们现在如果再去重温时往往会因为太模糊而看不下去&#xff0c;那么我们有什么好的办法可以修复动漫的清晰度呢&#xff1f;一起来看看吧&#xff01; 不管是修复动画片&#xff0c;还是修复…

SelfGNN: Self-Supervised Graph Neural Networks for Sequential Recommendation

SelfGNN: Self-Supervised Graph Neural Networks for Sequential Recommendation&#xff08;Sigir2024&#xff09; 摘要 顺序推荐通过对用户的时间和顺序交互模式进行建模&#xff0c;有效地解决信息过载问题。 为了克服监督信号的局限性&#xff0c;最近的方法在推荐系统中…

Hyper-V如何将文件复制到虚拟机?教您3个简单的方法!

需要将文件复制到虚拟机&#xff01; “大家好&#xff0c;有谁知道Hyper-V怎么将文件复制到虚拟机吗&#xff1f;我有一些文件&#xff0c;想要从主机中复制进虚拟机中&#xff0c;但是我不知道该怎么操作&#xff0c;有谁可以帮帮我吗&#xff1f;谢谢。” Hyper-V虚拟机可…

Vuex遇到浏览器刷新,store里存的数据还在吗?

我们在做Vue前端项目的时候&#xff0c;很可能会使用Vuex来做一些状态或者数据管理&#xff0c;希望在一定程度上&#xff0c;不发送网络请求&#xff0c;不经过密集的组件数据传输&#xff0c;也可以达到数据共享的目的。但如果浏览器页面刷新了&#xff0c;Vuex中store里存的…

​1:25万基础电子地图(江西版)

我们在《50幅1:25万基础电子地图&#xff08;四川版&#xff09;》和《1&#xff1a;25基础电子地图&#xff08;云南版&#xff09;》等文中&#xff0c;为你分享过四川和云南的基础电子地图。 现在我们再为你分享江西的1&#xff1a;25万基础电子地图&#xff0c;你可以在文…

成都某展厅2套2x2透明OLED拼接屏项目

成都某展厅的2套2x2透明OLED拼接屏展示设计具有独特的技术魅力和视觉效果。以下是关于这一展示设计的详细介绍&#xff1a; 1.产品规格 类型&#xff1a;透明OLED拼接屏 尺寸与配置&#xff1a;每套为2x2拼接&#xff0c;即每套由4块屏幕组成。 2.应用场景 成都某展厅&#…

最新下载:Boom 3D软件安装视频教程

简介&#xff1a; Boom 3D是适用于Mac和Windows系统的专业音效增强软件&#xff0c;旨在通过播放器&#xff0c;媒体或流媒体服务等介质&#xff0c;在不同类型的耳机上以3D环绕效果播放媒体内容。您无需使用昂贵的耳机或其他附加环绕音效增强器即可感受3D环绕音乐。 安 装 包…

怎么把网页上的接口信息导入postman

第一步 打开f12&#xff0c;右键选中需要的接口。选择copy-copy as cURL 第二步 打开postman&#xff0c;选择"Raw Text"&#xff0c; 把刚才复制的curl粘贴到空白位置&#xff0c;点击Continue - 最后的效果。导入的接口自带cookie&#xff0c;不用再输入cookie&a…

zotero style最新(可全文翻译)

问题&#xff1a;在下载zotero style的时候&#xff0c;总会出现各种奇奇怪怪的问题&#xff0c;不是期刊没有级别&#xff0c;就是没有IF之类的&#xff1b; 解决&#xff1a;https://github.com/MuiseDestiny/zotero-style/releases 在这里下载最新的版本 若要使用全文翻译…

Matlab进阶绘图第60期—带伪彩图的曲面图

带伪彩图的曲面图是曲面图与伪彩图的组合。 其中&#xff0c;伪彩图与曲面图的颜色用于表示同一个特征。 由于伪彩图无遮挡但不直观&#xff0c;曲面图直观但有遮挡&#xff0c;而将二者组合&#xff0c;可以实现优势互补。 本期就来分享一下带伪彩图的曲面图的绘制方法&…

深入探索Java开发世界:Java基础~类型分析大揭秘

文章目录 一、基本数据类型二、封装类型三、类型转换四、集合类型五、并发类型 Java基础知识&#xff0c;类型知识点梳理~ 一、基本数据类型 Java的基本数据类型是语言的基础&#xff0c;它们直接存储在栈内存中&#xff0c;具有固定的大小和不变的行为。 八种基本数据类型的具…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第42课-多人联机-实时互动

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第42课-多人联机-实时互动 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界…