news 2026/10/12 20:39:04

基础算法:滑动窗口_python版本

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基础算法:滑动窗口_python版本

滑动窗口算法简介

滑动窗口是一种用于处理数组或字符串子区间问题的高效算法。通过维护一个动态窗口(通常由左右指针定义),在遍历过程中调整窗口大小或位置,避免重复计算,将时间复杂度从O(n²)优化至O(n)。适用于连续子数组、子串等问题。


滑动窗口的典型应用场景

  • 寻找满足条件的最小/最大子数组长度(如和≥target的最短子数组)。
  • 统计满足特定条件的子串或子数组数量(如包含所有字符的最短覆盖子串)。
  • 处理固定长度窗口的问题(如计算大小为k的子数组平均值)。

Python实现模板

可变窗口大小(通用模板)
def sliding_window(s, target): left = 0 result = 0 # 或其他初始值(如float('inf')) current_value = 0 # 当前窗口的统计值(如和、字符频率等) for right in range(len(s)): current_value += s[right] # 更新右指针带来的影响 while 窗口满足条件(如current_value >= target): result = min(result, right - left + 1) # 更新结果(根据问题调整) current_value -= s[left] # 移除左指针的影响 left += 1 # 收缩窗口 return result
固定窗口大小(示例:大小为k的子数组平均值)
def fixed_window(nums, k): window_sum = sum(nums[:k]) result = [window_sum / k] for i in range(k, len(nums)): window_sum += nums[i] - nums[i - k] # 滑动窗口:移除左端,加入右端 result.append(window_sum / k) return result

https://www.zhihu.com/zvideo/1992086275700854850/
https://www.zhihu.com/zvideo/1992086274874578007/
https://www.zhihu.com/zvideo/1992086273930835733/
https://www.zhihu.com/zvideo/1992086272345411781/
https://www.zhihu.com/zvideo/1992086268776039137/
https://www.zhihu.com/zvideo/1992086268062999793/
https://www.zhihu.com/zvideo/1992086267031212429/
https://www.zhihu.com/zvideo/1992086266234282270/
https://www.zhihu.com/zvideo/1992086264002933279/
https://www.zhihu.com/zvideo/1992086262732051397/
https://www.zhihu.com/zvideo/1992086262019023358/
https://www.zhihu.com/zvideo/1992086260995610002/
https://www.zhihu.com/zvideo/1992086260819452112/
https://www.zhihu.com/zvideo/1992086260005757376/
https://www.zhihu.com/zvideo/1992086259796047132/
https://www.zhihu.com/zvideo/1992086258877494228/
https://www.zhihu.com/zvideo/1992086257447236496/
https://www.zhihu.com/zvideo/1992086256990057914/
https://www.zhihu.com/zvideo/1992086255610126469/
https://www.zhihu.com/zvideo/1992086254024673022/
https://www.zhihu.com/zvideo/1992086251709415629/
https://www.zhihu.com/zvideo/1992086251445170546/
https://www.zhihu.com/zvideo/1992086249360597354/
https://www.zhihu.com/zvideo/1992086249796813324/
https://www.zhihu.com/zvideo/1992086247460603291/
https://www.zhihu.com/zvideo/1992086247896786890/
https://www.zhihu.com/zvideo/1992086245468303713/
https://www.zhihu.com/zvideo/1992086244939826725/
https://www.zhihu.com/zvideo/1992086241408223124/
https://www.zhihu.com/zvideo/1992086242108658791/
https://www.zhihu.com/zvideo/1992086239504007889/
https://www.zhihu.com/zvideo/1992086238363145467/
https://www.zhihu.com/zvideo/1992086238778369509/
https://www.zhihu.com/zvideo/1992086235288717115/
https://www.zhihu.com/zvideo/1992086236370858977/
https://www.zhihu.com/zvideo/1992086235800434298/
https://www.zhihu.com/zvideo/1992086233799759300/
https://www.zhihu.com/zvideo/1992086233120265991/
https://www.zhihu.com/zvideo/1992086232621131270/
https://www.zhihu.com/zvideo/1992086231664841273/
https://www.zhihu.com/zvideo/1992086231597741830/
https://www.zhihu.com/zvideo/1992086229181818148/
https://www.zhihu.com/zvideo/1992086229106325237/
https://www.zhihu.com/zvideo/1992086227973845402/
https://www.zhihu.com/zvideo/1992086227508298907/
https://www.zhihu.com/zvideo/1992086223934742995/
https://www.zhihu.com/zvideo/1992086222378639453/
https://www.zhihu.com/zvideo/1992086222340891585/
https://www.zhihu.com/zvideo/1992086220050802315/
https://www.zhihu.com/zvideo/1992086218834461645/
https://www.zhihu.com/zvideo/1992086216741515924/
https://www.zhihu.com/zvideo/1992086214795368066/
https://www.zhihu.com/zvideo/1992086211058234131/
https://www.zhihu.com/zvideo/1992086208965264892/
https://www.zhihu.com/zvideo/1992086209279852609/
https://www.zhihu.com/zvideo/1992086209292412677/
https://www.zhihu.com/zvideo/1992086207132345927/
https://www.zhihu.com/zvideo/1992086207816033726/
https://www.zhihu.com/zvideo/1992086206742295474/
https://www.zhihu.com/zvideo/1992086206352205819/
https://www.zhihu.com/zvideo/1992086206402561315/
https://www.zhihu.com/zvideo/1992086203516884357/
https://www.zhihu.com/zvideo/1992086202308894883/
https://www.zhihu.com/zvideo/1992086201180657319/
https://www.zhihu.com/zvideo/1992086200459227255/
https://www.zhihu.com/zvideo/1992086199846846688/
https://www.zhihu.com/zvideo/1992086198773118078/
https://www.zhihu.com/zvideo/1992086198664045259/
https://www.zhihu.com/zvideo/1992086197598697102/
https://www.zhihu.com/zvideo/1992086196722110763/
https://www.zhihu.com/zvideo/1992086197166694427/


实战案例

案例1:和≥target的最短子数组(LeetCode 209)
def minSubArrayLen(target, nums): left = 0 min_len = float('inf') current_sum = 0 for right in range(len(nums)): current_sum += nums[right] while current_sum >= target: min_len = min(min_len, right - left + 1) current_sum -= nums[left] left += 1 return min_len if min_len != float('inf') else 0
案例2:无重复字符的最长子串(LeetCode 3)
def lengthOfLongestSubstring(s): left = 0 max_len = 0 char_index = {} # 记录字符最后出现的位置 for right in range(len(s)): if s[right] in char_index and char_index[s[right]] >= left: left = char_index[s[right]] + 1 # 移动左指针到重复字符的下一位 char_index[s[right]] = right max_len = max(max_len, right - left + 1) return max_len

关键注意事项

  • 窗口条件:明确收缩窗口的条件(如和超过阈值、出现重复字符)。
  • 边界处理:检查输入为空或无法满足条件的情况(如返回0或特定值)。
  • 数据结构:根据问题选择哈希表(统计频率)或变量(记录和、计数等)。

通过调整模板中的窗口条件和更新逻辑,可解决大多数滑动窗口问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 11:40:15

Ray-MMD终极完整教程:从零开始掌握3D动画渲染

Ray-MMD终极完整教程:从零开始掌握3D动画渲染 【免费下载链接】ray-mmd 🎨 The project is designed to create a physically-based rendering at mikumikudance. 项目地址: https://gitcode.com/gh_mirrors/ra/ray-mmd Ray-MMD是一个强大的开源渲…

作者头像 李华
网站建设 2026/10/13 12:29:36

I2C开发板实操教程:基于STM32的入门应用

手把手教你玩转STM32上的I2C通信:从协议到实战,零死角解析你有没有遇到过这样的场景?接好了一个温湿度传感器,代码也写了,可就是读不出数据——要么全是0xFF,要么总线直接“锁死”。反复检查线路、地址、上…

作者头像 李华
网站建设 2026/10/13 12:29:28

Kimi-VL-Thinking:2.8B参数如何玩转多模态推理?

Kimi-VL-Thinking:2.8B参数如何玩转多模态推理? 【免费下载链接】Kimi-VL-A3B-Thinking 项目地址: https://ai.gitcode.com/MoonshotAI/Kimi-VL-A3B-Thinking 国内AI团队Moonshot AI推出最新开源多模态模型Kimi-VL-A3B-Thinking,以仅…

作者头像 李华
网站建设 2026/10/12 13:56:32

如何快速掌握Crypto++:现代密码学实战的完整指南

如何快速掌握Crypto:现代密码学实战的完整指南 【免费下载链接】cryptopp free C class library of cryptographic schemes 项目地址: https://gitcode.com/gh_mirrors/cr/cryptopp 在当今数字化时代,数据安全已成为每个开发者的必备技能。Crypto…

作者头像 李华
网站建设 2026/10/13 6:55:36

RootHide越狱工具新手完整使用指南:从安装到应用全流程解析

RootHide越狱工具新手完整使用指南:从安装到应用全流程解析 【免费下载链接】Dopamine-roothide roothide Dopamine 1.x for ios15.0~15.4.1, A12~A15,M1 Devices. and roothide Dopamine 2.x is at: https://github.com/roothide/Dopamine2-roothide 项目地址: h…

作者头像 李华
网站建设 2026/10/13 6:55:42

.NET运行时方法修补完整指南:Harmony库深度解析

.NET运行时方法修补完整指南:Harmony库深度解析 【免费下载链接】Harmony A library for patching, replacing and decorating .NET and Mono methods during runtime 项目地址: https://gitcode.com/gh_mirrors/ha/Harmony Harmony是一个专为.NET和Mono平台…

作者头像 李华