LeetCode 热题 100 题解(3):滑动窗口
LeetCode 热题 100 题解3滑动窗口一、什么是滑动窗口在上一篇博客中我们探讨了双指针技巧。这次要介绍的滑动窗口算法实际上是双指针思想的一种特殊应用。我们可以将其形象地比作在一维数组上移动的观察窗口通过左右两个指针来界定窗口的边界。与普通双指针不同的是这个窗口始终保持单向向右移动的特性右指针负责扩展窗口范围纳入新元素而左指针则负责收缩窗口排除不必要的数据。为什么要设计这种算法呢在数组与字符串处理中我们常遇到这样的需求寻找满足特定条件的连续区间子数组或子串并计算其最大/最小长度、数量或区间极值。最直观的解法是暴力枚举所有可能的左右边界通过双重循环逐一检查每个区间。然而这种方法存在明显缺陷相邻区间包含大量重复元素每次重新计算区间属性会导致严重的效率浪费时间复杂度高达 O(n²)稍大数据量就会超时。滑动窗口算法则能高效解决这个问题。通过动态维护窗口内的有效信息每个元素最多被处理两次进入和离开窗口从而将整体时间复杂度优化至线性 O(n)。滑动窗口算法的正确运行依赖于一个关键前提——单调性。所谓单调性指的是窗口状态的变化遵循单一方向趋势不会出现反复波动。这意味着当窗口满足或违反特定条件时通过扩展或收缩窗口所产生的结果都是可预测的。我们结合具体例子来分析。比如要求区间内至多 k 种不同字符求最长合法区间。假设窗口 [L, R] 是合法窗口。那么它内部所有更窄的窗口 [Lx, R] 依然合法。收缩只会更容易合法而向外扩张更容易变得不合法。再比如要求窗口包含目标所有字符求最短合法区间假设窗口 [L, R] 合法。那么向外拓展得到的 [L, R1] 依旧合法。 窗口拉大不会丢失合法性向内收缩才可能变成非法。最后再看一个没有单调性的反面例子数组有正有负寻找和等于 k 的子数组。比如 nums[2,-1,3], k3窗口和没有单调趋势——不管向外拓展还是向内收缩和可能变大、也可能变小此时滑动窗口就不再适用。因此遇到连续区间问题时需要先判断区间是否具有单调性不可盲目套用滑动窗口。根据窗口长度是否固定滑动窗口可分为两类一种是长度不变的定长滑动窗口每次移动固定步长另一种是长度可变的动态滑动窗口能根据条件自动调整窗口大小这也是算法考试和面试中的重点考察内容。在实际应用中不同题目需要维护的窗口信息各异常见的有字符出现频率区间元素和区间最大值元素种类数量这些需求衍生出多种实现方式包括普通计数滑动窗口结合前缀和的滑动窗口使用单调队列的滑动窗口初学者常犯的错误是死记硬背代码模板但掌握滑动窗口算法的关键在于理解三个核心问题如何定义合法窗口的条件何时扩展右边界何时收缩左边界窗口元素变化时如何同步更新统计信息接下来我们将通过两道典型例题逐步剖析不同场景下的滑动窗口实现方法并总结各类题型的共性和易错点。二、例题1.无重复字符的最长子串找符合要求的连续区间是滑窗的典型应用我们来看此题能否使用滑动窗口。合法窗口的条件是窗口内的所有字符必须不重复。观察单调性规律如果窗口 [left, right] 满足无重复那么任意向内收缩得到的 [leftx, right] 一定也合法当窗口向右扩张时有可能引入重复字符使窗口变为非法。这种单向稳定的规律性满足了滑动窗口算法所需的单调性前提确保了左右指针只需单向右移。如此我们再来规划算法流程右指针 right持续向右移动不断把新字符纳入窗口尝试扩大候选区间每当新加入字符造成窗口出现重复窗口非法持续右移 left不断剔除窗口最左侧字符直到窗口重新恢复 “无重复” 的合法状态窗口处于合法状态时实时计算当前窗口长度持续更新全局最长长度。classSolution(object):deflengthOfLongestSubstring(self,s): :type s: str :rtype: int char_setset()left0lengthlen(s)max_len0forrightinrange(length):# 存在重复不断收缩左边界whiles[right]inchar_set:char_set.remove(s[left])left1char_set.add(s[right])max_lenmax(max_len,right-left1)returnmax_len当然我们没有必要让 left 一格一格地走动而是用哈希表记录字符最新下标让 left 直接跳到重复字符下一位以此对左指针跳跃做一定优化。classSolution(object):deflengthOfLongestSubstring(self,s):last_posdict()max_len0left0forright,cinenumerate(s):# 字符出现过并且位置left说明在当前窗口内重复ifcinlast_posandlast_pos[c]left:leftlast_pos[c]1last_pos[c]right max_lenmax(max_len,right-left1)returnmax_len这种算法每个字符最多入集合、出集合一次时间复杂度 O (n)。2.找到字符串中所有字母异位词在讲解哈希表时我们曾以字母异位词为例介绍了排序法和计数法两种解法其中计数法具有更优的时间复杂度。基于此我们可以采用固定窗口法将窗口大小设为模式串p的长度通过滑动窗口统计字符出现频次。具体实现步骤如下1.创建两个频次数组p_count 数组记录模式串p中各字符的所需数量s_count 数组统计当前滑动窗口内的字符分布情况2.初始化第一个完整窗口计算初始字符频次3.滑动窗口操作右移窗口时移除左侧滑出边界的字符并更新 s_count 数组纳入右侧新进入窗口的字符同步更新 s_count 数组4.每当形成完整窗口时检查 s_count 与 p_count 是否完全匹配若匹配则记录当前窗口的起始位置。classSolution(object):deffindAnagrams(self,s,p): :type s: str :type p: str :rtype: List[int] s_lenlen(s)p_lenlen(p)res[]# 边界s比p短不可能存在异位词ifs_lenp_len:returnres# 计数数组对应26个小写英文字母s_count[0]*26p_count[0]*26# 初始化统计p的字符频次同时统计s第一个窗口的频次foriinrange(p_len):p_count[ord(p[i])-ord(a)]1s_count[ord(s[i])-ord(a)]1foriinrange(s_len-p_len1):# 判断当前窗口是否匹配ifs_countp_count:res.append(i)ifis_len-p_len:# 移出窗口左侧的字符s_count[ord(s[i])-ord(a)]-1# 加入窗口右侧的新字符s_count[ord(s[ip_len])-ord(a)]1returnres三、总结滑动窗口是双指针思想的延伸专门用于解决连续子数组或子串问题。其核心原理在于区间状态的单调性窗口扩展或收缩导致的合法性变化具有单向趋势确保左右指针只向右移动从而将复杂度从暴力解法的 O(n2) 优化至线性的 O(n)。根据窗口长度是否固定可分为两类定长滑动窗口特点窗口长度固定每次整体右移一格 流程 初始化时填满窗口 每次移动时移除最左元素并纳入新右元素 持续维护窗口统计信息适用场景目标区间长度已知典型问题有字符串字母异位词、滑动窗口最大值可变长度滑动窗口根据目标不同分为两种模式最长合法区间右指针持续扩展直到非法再收缩左边界。例如无重复字符的最长子串最短合法区间右指针扩展至合法后左指针压缩寻找最小值。例如最小覆盖子串在具体实现中常用三种方式维护窗口信息对于普通字符统计通常采用频率数组基于桶计数思想当需要获取区间最值时使用单调队列若需记录元素位置信息则选择哈希字典。一般解题步骤确认问题是否涉及连续区间验证单调性并判断窗口类型定长/可变定义合法窗口条件确定窗口扩展/收缩的触发条件设计数据结构及更新逻辑在适当时机更新最终答案

相关新闻

2026年,AI Coding Agent 正在重写「程序员」的定义——而你准备好了吗?

2026年,AI Coding Agent 正在重写「程序员」的定义——而你准备好了吗?

# 2026年,AI Coding Agent 正在重写「程序员」的定义——而你准备好了吗?> 不是危言耸听:2026年的开发者已经分成了两类——驾驭AI Agent的人,和被AI Agent替代的人。---## 一、从一个周三下午说起下午两点,产品经理…

2026/7/23 9:42:16阅读更多 →
协程到底是什么?看完这个故事明明白白!

协程到底是什么?看完这个故事明明白白!

神秘使者 “久闻Java语言跨越平台,框架众多,不过二十年功夫,就已晋升天下第一编程语言,今日一见,果然名不虚传呐!” “使者先生您过奖了,咱们快些走,国王陛下已经等候多时了” 今日&…

2026/7/23 9:42:16阅读更多 →
Temu全托管自动核价怎么搞?用“自动化防亏规则”破解人工盯盘与批量改价难题

Temu全托管自动核价怎么搞?用“自动化防亏规则”破解人工盯盘与批量改价难题

在做 Temu 全托管店铺时,不少卖家最头疼的就是核价繁琐、人工盯盘效率低。尤其是在新品上新阶段,面对海量 SKU 和频繁的价格变动,如果全靠人工去逐个比对利润率、点击同意或重报,不仅容易看错漏处理,还会严重拖慢商品上…

2026/7/23 9:40:15阅读更多 →
MSPM0定时器TIMx配置实战:从计数模式到捕获比较应用

MSPM0定时器TIMx配置实战:从计数模式到捕获比较应用

1. 定时器在嵌入式系统中的核心地位与TIMx模块概览在嵌入式开发领域,无论是驱动一个LED的呼吸灯,还是控制一台无刷电机的精准转速,亦或是测量一个超声波传感器的回波时间,其背后都离不开一个核心硬件外设——定时器。它就像是嵌入…

2026/7/23 11:11:15阅读更多 →
MSPM0安全启动与BSL配置实战:从CRC校验到SWD策略详解

MSPM0安全启动与BSL配置实战:从CRC校验到SWD策略详解

1. 项目概述:为什么MSPM0的安全启动值得你花时间研究?如果你正在使用或评估TI的MSPM0系列微控制器,尤其是在设计需要出厂后防篡改、防逆向或确保固件完整性的产品时,那么理解并正确配置其安全启动与BSL(Bootstrap Load…

2026/7/23 11:11:15阅读更多 →
1984-2026年税务总局法规文本分税种分行业数据

1984-2026年税务总局法规文本分税种分行业数据

数据介绍 数据整理税务总局法规文件,可按税种分类,税务总局法规文件,文件及附件8000,按法规位阶归类存放,可按税种和行业分类检索,标注文件时效,Excel表格架构化管理,方便检索和打开…

2026/7/23 11:11:15阅读更多 →
USB 2.0信号中继器选型、配置与高速PCB布局实战指南

USB 2.0信号中继器选型、配置与高速PCB布局实战指南

1. 项目概述:为什么我们需要USB 2.0信号中继器?做硬件设计,尤其是涉及高速接口的,信号完整性(SI)是个绕不开的坎。USB 2.0高速模式(High-Speed, 480 Mbps)的信号,在PCB走…

2026/7/23 11:11:15阅读更多 →
QoderWork:NAS-RL与业务流程优化的智能开发平台

QoderWork:NAS-RL与业务流程优化的智能开发平台

1. QoderWork初体验:当NAS-RL遇上业务流程优化第一次打开QoderWork的界面时,那种科技感扑面而来的震撼至今记忆犹新。作为一个长期关注自动化工具的技术从业者,我立刻被它融合NAS-RL(神经架构搜索与强化学习)和BPO&…

2026/7/23 11:11:15阅读更多 →
NeRF与3D高斯泼溅中的动态场景不确定性建模

NeRF与3D高斯泼溅中的动态场景不确定性建模

1. 项目概述:NeRF动态重建中的不确定性建模挑战在三维场景重建领域,NeRF(Neural Radiance Fields)和3D Gaussian Splatting(wildGS)技术正在突破传统静态重建的限制。这个标题聚焦于两种前沿方法在动态场景…

2026/7/23 11:09:15阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/22 18:55:50阅读更多 →