单调队列 滑动窗口 python代码

滑动窗口

题意

有一个长为 nn 的序列 aa,以及一个大小为 kk 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。

例如:

The array is [1,3,-1,-3,5,3,6,7][1,3,−1,−3,5,3,6,7], and k = 3k=3。

输入格式
输入一共有两行,第一行有两个正整数 n,kn,k。 第二行 nn 个整数,表示序列 aa

输出格式
输出共两行,第一行为每次窗口滑动的最小值
第二行为每次窗口滑动的最大值

输入输出样例
输入
8 3
1 3 -1 -3 5 3 6 7
输出
-1 -3 -3 -3 3 3
3 3 5 5 6 7


n, k = map(int,input().split())
du = map(int, input().split())#注意这种读入方式
du = list(du)

head = 1
tail = -1
dui = list(range(1000001))
op = list(range(1000001))
p = list(range(1000001))
for i in range(0,n):
    op[i+1] = du[i]


tail = 0
for i in range(1, n+1):
    while dui[tail] >= op[i] and tail >= head :
        tail = tail -1
    tail = tail + 1
    dui[tail] = op[i]
    p[tail] = i
    while p[head] <= i - k :
        head = head +1

    if i>=k:
        if i == n :
            print(dui[head], end = '\n')
        else:
            print(dui[head], end=' ')



tail = 0
head = 1
for i in range(0,n):
    op[i+1] = du[i]

for i in range(1, n+1):

    while dui[tail] <= op[i] and tail >= head :
        tail = tail -1
    tail = tail + 1
    dui[tail] = op[i]
    p[tail] = i
    while p[head] <= i - k:
        head = head + 1

    if i>=k:
        print(dui[head], end=' ')


解:

模版题
数据结构:单调队列
此处要强调的是要记录进队元素来自原来读入的数组的位置,这样一来,如果窗口滑动了响应的不在窗口的元素也应该从队列中去除。其中,队列中的每个元素对应的读入数组的位置应该是有序的。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读