滑动窗口(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),因为我们只使用了固定数量的额外变量。

答案:

总结

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

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

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

相关文章

对 2024 年美赛选题的建议

对2024年美赛选题的建议包括&#xff1a; 1. 深入探讨当下全球面临的重大问题和挑战&#xff1a;鉴于美赛通常聚焦于全球性议题&#xff0c;如气候变化、可持续发展、数据分析等&#xff0c;参赛学生应关注这些议题&#xff0c;并深入研究相关数据与背景信息&#xff0c;以提出…

单片机建立自己的库文件(4)

文章目录 前言一、新建自己的外设文件夹1.新建外设文件夹&#xff0c;做项目好项目文件管理2.将之前写的.c .h 文件添加到文件夹中 二、在软件中添加项目 .c文件2.1 编译工程保证没问题2. 修改项目列表下的名称 三、在软件项目中添加 .h文件路径四、实际使用测试总结 前言 提示…

sheng的学习笔记-AI-集成学习(adaboost,bagging,随机森林)

ai目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 目录​​​​​​​ 集成学习 什么是集成学习 集成学习一般结构&#xff1a; 示意图 弱学习器 经典算法 Boosting 什么是boosting 方法图 AdaBoost 算法 AdaBoost示意图 流程解析&#xff1a; 错误分类率error…

太速科技-FMC213V3-基于FMC兼容1.8V IO的Full Camera Link 输入子卡

FMC213V3-基于FMC兼容1.8V IO的Full Camera Link 输入子卡 一、板卡概述 该板卡为了考虑兼容1.8V电平IO&#xff0c;适配Virtex7&#xff0c;Kintex Ultrascale&#xff0c;Virtex ultrasacle FPGA而特制&#xff0c;如果要兼容原来的3.3V 也可以修改硬件参数。板卡支持1路…

快速欧氏聚类与普通欧氏聚类比较

1、前言 文献《FEC: Fast Euclidean Clustering for Point Cloud Segmentation》介绍了一种快速欧氏聚类方法,大概原理可以参考如下图,具体原理可以参考参考文献。 2、时间效率比较:快速欧氏聚类VS普通欧氏聚类 网上搜集的快速欧式聚类,与自己手写的普通欧式聚类进行对比,…

SLG火并6月:多强鼎立,增量用户发展成行业新题

SLG赛道进入到6月&#xff0c;《三国&#xff1a;谋定天下》、《野兽领主&#xff1a;新世界》、《无尽冬日》大量新品袭来搅动市场。 在这样的关口&#xff0c;占据SLG半壁江山的灵犀互娱《三国志战略版》先一步刊登出战报&#xff0c;宣布1亿SLG玩家已收归麾下。 但新的挑战…

Linux时间子系统6:NTP原理和Linux NTP校时机制

一、前言 上篇介绍了时间同步的基本概念和常见的时间同步协议NTP、PTP&#xff0c;本篇将详细介绍NTP的原理以及NTP在Linux上如何实现校时。 二、NTP原理介绍 1. 什么是NTP 网络时间协议&#xff08;英语&#xff1a;Network Time Protocol&#xff0c;缩写&#xff1a;NTP&a…

华为数通企业面试笔试实验题

1. 笔试题 1.1 实验拓扑 1.2 实验要求 公司A为小型销售公司,需要实现基本上网功能,蓝色部分为外网线,提供DHCP服务 DnsServer:114.114.114.114 帮助网管排查某一台计算机在某一台交换机的某个端口 2. 操作步骤 配置路由器相关的LAN侧接口IP地址 配置DHCP项,要求有PC1与PC2…

大模型KV Cache节省神器MLA学习笔记(包含推理时的矩阵吸收分析)

首先&#xff0c;本文回顾了MHA的计算方式以及KV Cache的原理&#xff0c;然后深入到了DeepSeek V2的MLA的原理介绍&#xff0c;同时对MLA节省的KV Cache比例做了详细的计算解读。接着&#xff0c;带着对原理的理解理清了HuggingFace MLA的全部实现&#xff0c;每行代码都去对应…

软件改为开机自启动

1.按键 win R,输入“shell:startup”命令, 然后就可以打开启动目录了&#xff0c;如下&#xff1a; 2.然后&#xff0c;把要开机启动的程序的图标拖进去即可。 参考&#xff1a;开机启动项如何设置

JAVA面试(六)

缓存 MemcachedredisRedis常见数据类型和使用Redis缓存持久化RDB-快照AOF-追加文件 Redis数据过期机制惰性删除定期删除 Redis缓存淘汰策略&#xff08;8种&#xff09;算法LRU &#xff08;Least Recently Used&#xff09;&#xff1a;最近最少使用LFU&#xff08;Least Freq…

day12--150. 逆波兰表达式求值+239. 滑动窗口最大值+ 347. 前 K 个高频元素

一、150. 逆波兰表达式求值 题目链接&#xff1a;https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/ 文章讲解&#xff1a;https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html 视频…

R可视化:微生物相对丰度或富集热图可视化

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2介绍 热图(Heatmap)是一种数据可视化方法,它通过颜色的深浅或色调的变化来展示数据的分布和密度。在微生物学领域,热图常用于表示微生物在不同分组(如…

【leetcode刷题】面试经典150题 , 27. 移除元素

leetcode刷题 面试经典150 27. 移除元素 难度&#xff1a;简单 文章目录 一、题目内容二、自己实现代码2.1 方法一&#xff1a;直接硬找2.1.1 实现思路2.1.2 实现代码2.1.3 结果分析 2.2 方法二&#xff1a;排序整体删除再补充2.1.1 实现思路2.1.2 实现代码2.1.3 结果分析 三、…

字符串专题详解

目录 字符串hash进阶 KMP算法 next数组 KMP算法 KMP算法优化 字符串hash进阶 字符串hash是指将一个字符串S映射为一个整数&#xff0c;使得该整数可以尽可能唯一地代表字符串S。那么在一定程度上&#xff0c;如果两个字符串转换成的整数相等&#xff0c;就可以认为这两个…

麻了,5年Java竟然不知道幂等......

在分布式系统中&#xff0c;接口幂等性是确保操作一致性的关键特性。 啥是幂等性 幂等性 指的是在给定的条件下&#xff0c;无论操作执行多少次&#xff0c;其结果都保持不变。在接口设计中&#xff0c;幂等性意味着使用相同的参数多次调用接口&#xff0c;应产生与单次调用相…

STM32学习笔记(五)--TIM输出比较PWM详解

&#xff08;1&#xff09;配置步骤1.配置RCC外设时钟 开启GPIO以及TIM外设2.配置时基单元的时钟 包含时钟源选择配置初始化时基单元3.配置输出比较单元 包含CCR的值 输出比较模式 极性选择 输出使能等4.配置GPIO口 初始化为复用式推挽输出的配置5.运行控制 启动计数器 输出PWM…

Windows CSC服务特权提升漏洞(CVE-2024-26229)

文章目录 前言声明一、漏洞描述二、漏洞成因三、影响版本四、漏洞复现五、CVE-2024-26229 BOF六、修复方案 前言 Windows CSC服务特权提升漏洞。 当程序向缓冲区写入的数据超出其处理能力时&#xff0c;就会发生基于堆的缓冲区溢出&#xff0c;从而导致多余的数据溢出到相邻的…

QT 的文件

QT 和C、linux 一样&#xff0c;也有自带的文件系统. 它的操作和C、c差不多&#xff0c;不过也需要我们来了解一下。 输入输出设备类 QObject 有一个子类&#xff0c;名为 QIODevice 类&#xff0c;如其名字&#xff0c;该类是管理所有输入输出设备的类。 比如文件、网络套…

【ic-tool】timegen使用

一、前言 TimeGen是一个用于时序波形编辑的CAD工具&#xff0c;它允许数字设计工程师快速有效地绘制数字时序图。TimeGen时序图可以很容易地导出到其他窗口程序&#xff0c;如microsoftword&#xff0c;用于编写设计规范。可直接从官网下载TimeGEN软件&#xff1a;TimeGen Pro…