欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

单调队列

程序员文章站 2022-08-03 17:42:17
单调队列特点队列中的元素单调运用deque容器实现,保证能在两端操作由于每个元素最多进队一次,出队一次,所以O(1)单调队列例题输入输出样例8 31 3 -1 -3 5 3 6 7-1 -3 -3 -3 3 33 3 5 5 6 7在线OJ暴力搜索反正是会TLE,考虑单调队列O(n)#define _CRT_SECURE_NO_WARNINGS#includeusing namespace std;int n, k, p[...

单调队列特点

  • 队列中的元素单调
  • 运用deque容器实现,保证能在两端操作
  • 由于每个元素最多进队一次,出队一次,所以O(1)

单调队列例题

单调队列
输入输出样例

8 3
1 3 -1 -3 5 3 6 7
-1 -3 -3 -3 3 3
3 3 5 5 6 7


OJ

暴力搜索反正是会TLE,考虑单调队列O(n)

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;

int n, k, p[1000005];
deque<int>deq;//存放元素在原序列中的下标
int main() {
	ios::sync_with_stdio(false);//和用scanf提速差不多的作用,没用这个就会超时
	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		cin >> p[i];
	}
	for (int i = 1; i <= n; i++) {
		while (!deq.empty() && p[deq.back()] > p[i]) {//只要队尾元素大于此时要加入的元素,就pop
			deq.pop_back();
		}
		deq.push_back(i);
		if (i >= k) {//输出
			while (!deq.empty() && deq.front() <= i - k) {//删除不在此时k区间范围内的元素
				deq.pop_front();
			}
			cout << p[deq.front()] << " ";
		}
	}
	cout << endl;
	while (!deq.empty()) {
		deq.pop_back();
	}
	for (int i = 1; i <= n; i++) {
		while (!deq.empty() && p[deq.back()] < p[i]) {//与输出小值一样的思想
			deq.pop_back();
		}
		deq.push_back(i);
		if (i >= k) {
			while (!deq.empty() && deq.front() <= i - k) {
				deq.pop_front();
			}
			cout << p[deq.front()] << " ";
		}
	}
	cout << endl;
	return 0;
}

本文地址:https://blog.csdn.net/weixin_45776185/article/details/107361785

相关标签: 数据结构与算法