滑动窗口入门
2026年2月26日
计划中 算法 滑动窗口 子数组
概念理解
滑动窗口(Sliding Window)是双指针技巧的一种应用,专门用于处理连续子数组/子字符串相关的问题。
核心思想
维护一个”窗口”(通常由左右指针定义),通过移动窗口的边界来遍历所有可能的子区间。
适用场景
- 子数组/子字符串的最值问题
- 满足特定条件的最长子数组
- 包含特定字符的最短子串
- 固定大小的窗口统计
基本模板
固定大小窗口
def fixed_window(arr, k):
"""
固定大小为 k 的滑动窗口
Args:
arr: 数组
k: 窗口大小
Returns:
每个窗口的结果
"""
result = []
window_sum = sum(arr[:k])
result.append(window_sum)
for i in range(k, len(arr)):
# 移除最左边的元素,添加新元素
window_sum = window_sum - arr[i - k] + arr[i]
result.append(window_sum)
return result
可变大小窗口
def variable_window(arr, condition):
"""
可变大小的滑动窗口
Args:
arr: 数组
condition: 窗口需要满足的条件
Returns:
满足条件的最优结果
"""
left = 0
result = 0
for right in range(len(arr)):
# 扩大窗口
# 添加 arr[right] 到窗口
# 当窗口不满足条件时,缩小窗口
while not condition:
# 移除 arr[left] 从窗口
left += 1
# 更新结果
# result = max/min(result, window_size)
return result
经典例题
1. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target,找出数组中满足其和 ≥ target 的长度最小的连续子数组。
def min_subarray_len(nums, target):
"""
找出和 >= target 的最短子数组长度
"""
left = 0
window_sum = 0
min_len = float('inf')
for right in range(len(nums)):
window_sum += nums[right]
while window_sum >= target:
min_len = min(min_len, right - left + 1)
window_sum -= nums[left]
left += 1
return min_len if min_len != float('inf') else 0
# 使用示例
nums = [2, 3, 1, 2, 4, 3]
target = 7
print(min_subarray_len(nums, target)) # 输出: 2
2. 无重复字符的最长子串
def length_of_longest_substring(s):
"""
找出不含重复字符的最长子串长度
"""
char_set = set()
left = 0
max_len = 0
for right in range(len(s)):
while s[right] in char_set:
char_set.remove(s[left])
left += 1
char_set.add(s[right])
max_len = max(max_len, right - left + 1)
return max_len
# 使用示例
s = "abcabcbb"
print(length_of_longest_substring(s)) # 输出: 3
学习计划
- 理解滑动窗口的基本概念
- 掌握固定大小窗口的实现
- 掌握可变大小窗口的实现
- 练习 10+ 道相关题目