单调队列

 
 

题目描述

有一个 1 ∗ n 的矩阵,有 n 个正整数。

现在给你一个可以盖住连续的 k 的数的木板。

一开始木板盖住了矩阵的第 1 ∼ k 个数,每次将木板向右移动一个单位,直到右端与第 n 个数重合。

每次移动前输出被覆盖住的最大的数是多少。

输入输出格式

输入格式:

第一行两个数,n,k,表示共有 n 个数,木板可以盖住 k 个数。

第二行 n 个数,表示矩阵中的元素。

输出格式:

共 n − k + 1 行,每行一个正整数。

第 i 行表示第 i ∼ i + k − 1 个数中最大值是多少。

输入输出样例

输入样例#1:
5 3
1 5 3 4 2
输出样例#1: 
5
5
4

说明

对于 20% 的数据保证:1 ≤ n ≤ 1e3,1 ≤ k ≤ n

对于 50% 的数据保证:1 ≤ n ≤ 1e4,1 ≤ k ≤ n

对于 100% 的数据保证:1 ≤ n ≤ 2 ∗ 1e6,1 ≤ k ≤ n

矩阵中元素大小不超过 1e4。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=2e6+10;
 4 int a[N],n,k,tot,q[N],head;
 5 int main() {
 6     scanf("%d%d", &n, &k);
 7     for (int i = 1; i <= n; i++) {
 8         scanf("%d", &a[i]);
 9     }
10     head = tot = 1;
11     q[1] = 1;
12     for (int i = 1; i <= n; i++) {
13         if (q[head] <= i - k) {
14             head++;
15         }
16         while (tot >= head && a[q[tot]] <= a[i]) {
17             tot--;
18         }
19         q[++tot] = i;
20         if (i >= k) {
21             printf("%d\n", a[q[head]]);
22         }
23     }
24 }
View Code

思路:

实际上就是单调队列的直接应用。以维护每个滑动窗口的最大值 为例
• 维护一个下标和元素值都单调递增的队列
• 每次滑动窗口往后移动新增一个元素,当前队列队尾比它还大的 元素显然是没用的,可以直接删掉。这样队列中保存的都是“有用”
的东西
• 当队头的元素超出了窗口的范围,就要删掉
• 这么一番操作后,数据结构的性质没有发生变化
• 答案就是队头元素的值

转载于:https://www.cnblogs.com/Accpted/p/11211330.html

Python的单调队列是一种用于解决某些特定问题的数据结构。它是队列的一种变体,可以快速查询当前队列中的最大或最小元素。 单调队列通常用于需要维护当前滑动窗口中的最大或最小值的情况。例如,假设我们有一个长度为n的数组arr和一个窗口大小为k的滑动窗口。我们想要找到每个窗口中的最大值。单调队列就可以帮助我们在O(n)的时间复杂度内实现。 实现单调队列需要两个操作:push(x)和pop()。push(x)用于向队列的尾部添加元素x,而pop()用于从队列的头部删除元素。这两个操作具有O(1)的时间复杂度。 当我们向队列中添加一个新元素时,为了维护队列的单调性,我们需要从队列的尾部删除一些元素。具体来说,我们从队列的尾部开始,不断地删除比新元素小的元素,直到队列为空或者新元素大于等于队列尾部元素为止。这样,我们就可以保证队列中的元素是以递减顺序排列的。 当我们需要查询当前队列中的最大或最小值时,只需访问队列头部的元素即可。由于队列中的元素是以递减的顺序排列的,所以头部元素就是最大值(或最小值)。 总的来说,Python的单调队列是一种高效的数据结构,可以用于解决一些特定问题,如滑动窗口中的最大(或最小)值。它具有O(n)的时间复杂度,并且可以通过push(x)和pop()操作来维护队列的单调性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值