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

如何计算数组滑动窗口内不同元素的数量并优化解决超时问题

滑动窗口统计不同数字个数优化方案

原有代码问题

你原来的实现每次都对长度为B的窗口切片后转set统计不同元素,时间复杂度为O(NB)*,当数组长度和窗口大小较大时会触发超时。

优化思路

使用频率字典记录当前窗口内各元素的出现次数,搭配全局变量记录当前窗口的不同元素数量,每次窗口滑动仅需处理移出的左边界元素和新增的右边界元素,避免重复统计整个窗口。具体步骤如下:

  • 先统计第一个长度为B的窗口内各元素的频率,计算得到第一个窗口的不同元素数量,加入结果数组
  • 从第B个元素开始遍历数组,每次窗口右移一位:
    • 处理左边界移出元素:将对应元素的频率减1,若减到0说明该元素已完全移出当前窗口,不同元素数量减1
    • 处理右边界新增元素:若该元素当前频率为0说明是首次进入当前窗口,不同元素数量加1,再将对应元素的频率加1
    • 将当前窗口的不同元素数量加入结果数组

优化后代码

from collections import defaultdict

def count_distinct_sliding_window(A, B):
    freq = defaultdict(int)
    res = []
    distinct_cnt = 0
    # 初始化第一个窗口
    for i in range(B):
        num = A[i]
        if freq[num] == 0:
            distinct_cnt += 1
        freq[num] += 1
    res.append(distinct_cnt)
    # 滑动窗口遍历
    for i in range(B, len(A)):
        # 移出左边界元素
        left_num = A[i - B]
        freq[left_num] -= 1
        if freq[left_num] == 0:
            distinct_cnt -= 1
        # 加入右边界新元素
        right_num = A[i]
        if freq[right_num] == 0:
            distinct_cnt += 1
        freq[right_num] += 1
        res.append(distinct_cnt)
    return res

# 测试示例
A = [1, 2, 1, 3, 4, 3]
B = 3
print(count_distinct_sliding_window(A, B)) # 输出 [2, 3, 3, 2]

复杂度说明

  • 时间复杂度:O(N),仅需遍历数组两次,所有哈希表操作均为均摊O(1)
  • 空间复杂度:O(K),K为数组中不同元素的总个数,最坏情况为O(N)

内容的提问来源于stack exchange,提问作者Maws

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:48:01