滑动窗口技术:如何实现窗口每次向前移动1个以上单位?
自定义步长滑动窗口实现方案
常规固定步长1的滑动窗口,本质是窗口起始索引每次自增1。要实现每次移动4个单位或其他自定义步长,核心是控制窗口起始索引的递增值,同时做好边界判断避免数组越界即可。
实现核心要点
- 新增自定义步长参数
step,需要每次移动几个单位就将该参数设为对应正整数值 - 遍历窗口起始索引时,将原来每次+1的逻辑改为每次累加
step - 循环终止条件保持
i <= n - k,确保最后一个窗口长度始终为k,不会出现索引越界 - 如果要保留滑动窗口的线性时间复杂度优势,跳步时不需要重新计算整个窗口的元素和,只需要批量减去移出窗口的元素值、加上新进入窗口的元素值即可
基于现有代码的最小改动版本
该版本完全保留原有代码的计算逻辑,仅修改循环步长规则,改动成本最低:
import sys INT_MIN = -sys.maxsize - 1 def maxSum(arr, n, k, step=1): max_sum = INT_MIN i = 0 while i <= n - k: current_sum = 0 for j in range(k): current_sum = current_sum + arr[i+j] print(f"窗口起始索引{i},当前窗口和:{current_sum}") max_sum = max(current_sum, max_sum) i += step return max_sum arr = [1,4,2,10,2,3,1,0,20,1,1,2,3,4,5,6,3,2,4,5,1,4,5] k = 4 step = 4 # 自定义每次向前移动4个单位,可修改为其他正整数 n = len(arr) print(maxSum(arr, n, k, step))
该版本和原有实现逻辑一致,每次落在新窗口位置时都会重新遍历k个元素求和,时间复杂度为O(nk/step),适合k值较小的场景。
O(n)时间复杂度优化版本
该版本使用标准滑动窗口的累计求和思路,跳步时不需要重新遍历整个窗口,性能更优:
import sys INT_MIN = -sys.maxsize - 1 def maxSum(arr, n, k, step=1): max_sum = INT_MIN # 计算第一个窗口的初始和 current_sum = sum(arr[:k]) print(f"窗口起始索引0,当前窗口和:{current_sum}") max_sum = current_sum i = step while i <= n - k: # 批量更新窗口和:移除左端step个移出元素,加入右端step个新进入元素 for m in range(step): current_sum -= arr[i - step + m] current_sum += arr[i + k - step + m] print(f"窗口起始索引{i},当前窗口和:{current_sum}") max_sum = max(current_sum, max_sum) i += step return max_sum arr = [1,4,2,10,2,3,1,0,20,1,1,2,3,4,5,6,3,2,4,5,1,4,5] k = 4 step = 4 # 支持自定义任意正整数步长 n = len(arr) print(maxSum(arr, n, k, step))
补充说明
- 如果需要窗口完全不重叠,直接设置
step = k即可 - 如果设置的
step > k,窗口之间会存在未被覆盖的元素,属于正常逻辑,可根据业务需求调整参数
内容的提问来源于stack exchange,提问作者czy
相关产品推荐
相关产品推荐

