首页 > 其他分享 >手写单调队列

手写单调队列

时间:2023-03-31 13:56:53浏览次数:46  
标签:窗口 队列 1000001 int 手写 单调

单调队列的功能

单调队列,这个神奇的 \(O(n)\) 算法,经常有人把他和优先队列混为一谈,但实际上两者大相径庭。

总的来说,单调队列有两个功能:

  • 可以从队头/队尾出队,而且出入顺序正常。

  • 可以按照增/减/自定义比较方式求出队中最值。

单调队列有一个很著名的 \(Sliding\) \(Window\) (滑动窗口) 问题。该问题原型是:给定一个数组和一个窗口长度,求该窗口划过数组时,窗口框选的数字最值是多少。详见P1886 滑动窗口

单调队列的实现

单调队列需要手写模拟,实现方式也不是很难,请看代码:

#include<bits/stdc++.h>
using namespace std;
struct monotonic_queues{
	
	int n,k,a[1000001];
	int q[1000001],l,r,p[1000001];

	void read(){
		cin>>n>>k;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
	}

	void monotonic_max(){
		l=1;
		r=0;
		for(int i=1;i<=n;i++){
			while(l<=r&&q[r]<=a[i]){
				r--;
			}
			q[++r]=a[i];
			p[r]=i;
			while(p[l]<=i-k){
				l++;
			}
			if(i>=k)cout<<q[l]<<' ';
		}
		cout<<'\n';
	}

	void monotonic_min(){
		l=1;
		r=0;
		for(int i=1;i<=n;i++){
			while(l<=r&&q[r]>=a[i]){
				r--;
			}
			q[++r]=a[i];
			p[r]=i;
			while(p[l]<=i-k){
				l++;
			}
			if(i>=k)cout<<q[l]<<' ';
		}
		cout<<'\n';
	}

}worker;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	worker.read();
	worker.monotonic_min();
	worker.monotonic_max();
	return 0;
}

标签:窗口,队列,1000001,int,手写,单调
From: https://www.cnblogs.com/mornhus-xsylf-123/p/17276039.html

相关文章

  • 多线程队列接收
    packageorg.example.file.mult;//函数值接口@FunctionalInterfacepublicinterfaceFuncationCallback{voidcallback(Stringparam);} 回调接收 packageorg.example.file.mult;importjava.util.ArrayList;publicclassFuncationCallbackImpl{......
  • 手写 call、applay
     callFunction.prototype.mycall=function(context,...args){if(this===Function.prototype){returnundefined;}context=context||window;......
  • 循环队列(顺序)的实现:舞伴问题
    一、问题引入舞伴配对问题:假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头各出一人配成舞伴。若两队初始人数不相同,则较长的......
  • 手写bind函数
     Function.prototype.myBind_3=function(){letoutContext=arguments[0]//取上下文letoutArgs=Array.from(arguments).slice(1)//取外部入参......
  • 面试题59 - II. 队列的最大值(剑指offer)
    题目描述:请定义一个队列并实现函数max_value得到队列里的最大值,要求函数max_value、push_back和pop_front的均摊时间复杂度都是O(1)。若队列为空,pop_front和max_v......
  • 进程消息队列实例
    //write.c#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include<stdio.h>structmymesg{longmtype;//消息的类型,是一个整数且大于0......
  • 【单调队列】LeetCode 239. 滑动窗口最大值
    题目链接239.滑动窗口最大值思路单调队列的使用方法,可以参考【单调队列】LeetCode面试题59-II.队列的最大值在本题中将滑动窗口的移动看作往队列中放数和取数的过......
  • 用 Go 剑指 Offer 09. 用两个栈实现队列
    用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHe......
  • 基于CNN卷积神经网络的minst数据库手写字识别matlab仿真
    1.算法描述深度学习(DL,DeepLearning)是机器学习(ML,MachineLearning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI,ArtificialIn......
  • 随手写的一个 DataV代码 写到一半写不动了 弃坑!~
    !(function(v,g){g["DataV"]||(g["DataV"]=v());})(function(){constzoom=[0,20,40,60,80,99];//获取唯一序列码letxid_i......