您好,欢迎来到保捱科技网。
搜索
您的当前位置:首页关于双端队列 deque 模板 && 滑动窗口 (自出)

关于双端队列 deque 模板 && 滑动窗口 (自出)

来源:保捱科技网

嗯...

 

deque 即为双端队列,是c++语言中STL库中提供的一个东西,其功能比队列更强大,可以从队列的头与尾进行操作...

 

但是它的操作与队列十分相似,详见代码1:

 

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <deque>
 4 //实际上,引用queue头文件也可以,里面包含了deque头文件
 5 
 6 using namespace std;
 7 
 8 deque<int> dq; //定义一个储存整型变量的双端队列dq
 9 
10 int main() {
11     dq.push_back(1); //从队列后插入,此时dq:1 (下同)
12     dq.push_back(2); //1,2
13     dq.push_front(1); //从队列前插入,  1,1,2
14     dq.push_front(2); //2,1,1,2
15     cout << dq.front() << endl; //输出队首元素,结果为2
16     cout << dq.back() << endl; //输出队尾元素,结果为2
17     dq.pop_front(); //弹出队首元素 1,1,2
18     dq.pop_back(); //弹出队尾元素 1,1
19     dq.clear(); //清空操作 
20     if (dq.empty()) cout<<"队列已空!"<<endl; //判断队列是否为空
21     cout << dq.size() << endl; //结果为0,即输出队列中元素个数
22     return 0;
23 }
deque 模板

 

 

下面便是一个双端队列的模板题....先看题面:

 

滑动窗口求最值

题目描述:

  在一个长度为n的整数序列上有一个长度为k的滑动窗口,求滑动窗口内的最大值。

输入输出:

  输入n,k (n <= 10000,k <= n)

  输出第_个滑动窗口以及此滑动窗口中的最大值...

 

题目解析:

  就是在一个序列上对于每个长度为k的区间,求区间内的最值。

  一种朴素的做法是,枚举区间起点,再自此向后比较k个元素,找出最值,这样的复杂度是O(nk)的。

 

  还有一种不错的做法是利用单调队列。不妨假设我们已经得到了一个单调队列,他维护了当前的滑动窗口,显然,队首元素就是窗口内的最值。现在再来考虑如何用单调队列维护滑动窗口(以最大值为例,队列则为单调递减的,队首元素为窗口内的最大值):

 

  我们遍历序列的每个元素,当队列为空时,肯定要加入队列;队列不为空,就要先从队尾弹出较小的元素,再加入,保证队列单调(这里有一个有趣的类比,也是滑动窗口的主要思想:如果一位OIer比你年轻还比你强,那你就没法超越他了);但滑动窗口是有长度的,怎么考虑呢?我们可以保存每个元素的序号,当发现队首元素的序号与当前考虑元素相比,已经出了滑动窗口,就弹出队首元素。

 

  因为每个元素都只会进入队列一次且只会离开队列一次,可以认为时间复杂度是O(n)的。

 

 

下面请见std 外加详解:

 

 

关于滑动窗口这个题,稍微有点饶脑,但请记住上文中的红色+下滑线那句话即可理解...

转载于:https://www.cnblogs.com/New-ljx/p/10419099.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务