You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

滑动窗口技术:如何实现窗口每次向前移动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:15:31