1. 滑动窗口最大和问题解析
滑动窗口算法是解决数组/字符串子区间问题的高效技巧,在数据处理、信号处理、金融分析等领域有广泛应用。这个问题要求我们计算固定长度窗口在数组上滑动时产生的所有窗口和中的最大值。
1.1 问题重述与理解
给定一个长度为N的整数数组和一个长度为M的滑动窗口(M≤N),窗口从数组第一个元素开始,每次向右滑动一个单位,直到窗口右端到达数组末尾。每次窗口位置对应一个窗口和(窗口内所有元素之和),我们需要找出所有窗口和中的最大值。
示例:
- 输入数组:[10, 20, 30, 15, 23, 12]
- 窗口大小:3
- 窗口和序列:60(10+20+30), 65(20+30+15), 68(30+15+23), 50(15+23+12)
- 最大窗口和:68
1.2 暴力解法与复杂度分析
最直观的解法是暴力计算每个窗口的和:
python复制def max_window_sum_brute(arr, m):
max_sum = -float('inf')
for i in range(len(arr) - m + 1):
current_sum = sum(arr[i:i+m])
max_sum = max(max_sum, current_sum)
return max_sum
时间复杂度分析:
- 窗口滑动次数:N-M+1 ≈ O(N)
- 每次求和:O(M)
- 总复杂度:O(N*M)
当N和M都很大时(如题目中的10^5量级),这种解法会非常低效。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 滑动窗口优化算法
2.1 优化思路
观察相邻窗口的关系可以发现:
- 新窗口 = 旧窗口 - 移出的元素 + 新进入的元素
- 数学表达:sum_new = sum_old - arr[i-1] + arr[i+m-1]
这种差分计算将每次窗口和的计算从O(M)降到O(1),整体复杂度优化到O(N)。
2.2 算法实现步骤
- 计算初始窗口和(前M个元素之和)
- 初始化最大和为初始窗口和
- 从第二个窗口开始:
- 新窗口和 = 前一个窗口和 - 移出元素 + 新进入元素
- 更新最大和
- 返回最大和
