基隆市网站建设_网站建设公司_SSL证书_seo优化
2026/1/7 4:17:22 网站建设 项目流程

滑动窗口算法简介

滑动窗口是一种用于处理数组或字符串子区间问题的高效算法。通过维护一个动态窗口(通常由左右指针定义),在遍历过程中调整窗口大小或位置,避免重复计算,将时间复杂度从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或特定值)。
  • 数据结构:根据问题选择哈希表(统计频率)或变量(记录和、计数等)。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询