滑动窗口的最大值

设定划定窗口的长度,在给定列表上做滑动,求每次滑动的最大值

复制代码
nums, k = [1,3,-1,-3,5,3,6,7], 3
result = []
# method 1:bf
for i in range(len(nums)-k+1):
    result.append(max(nums[i:i+k]))
print(result)
# method 2:保存中间过程
result = []
first_max = max(nums[:k])
result.append(first_max)
for i in range(1, len(nums)-k+1):
    if first_max == nums[i-1]:
        first_max = max(nums[i:i+k])
        result.append(first_max)
    else:
        first_max = max(first_max, nums[i+k-1])
        result.append(first_max)
# method 3: heap (n*lgk)
nums, k = [1,3,-1,-3,5,3,6,7], 3
nums = [-e for e in nums]
result = []
for i in range(len(nums)-k+1):
    temp = nums[i:i+k]
    heapq.heapify(temp)
    result.append(-heapq.heappop(temp))
result

# method 4: both end queue
nums, k = [1,3,-1,-3,5,3,6,7], 3
n = len(nums)
q = deque()
for i in range(k):
    # 保持队首是最大值
    while q and nums[i] >= nums[q[-1]]:
        q.pop()
    q.append(i)
result = [nums[q[0]]]
for i in range(k, n):
    while q and nums[i] >= nums[q[-1]]:
        q.pop()
    q.append(i)
    while q[0] <= i-k:
        q.popleft()
    result.append(nums[q[0]])
result
复制代码

 

posted @   今夜无风  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2021-09-08 最长连续序列
2021-09-08 二叉树中的最大路径和-Python
2018-09-08 pandas的replace方法
2018-09-08 python的tqdm模块
2018-09-08 pandas的merge方法
2018-09-08 pandas的drop函数
2018-09-08 2018-文本分类文献阅读总结
点击右上角即可分享
微信分享提示