算法设计-单调队列

这篇具有很好参考价值的文章主要介绍了算法设计-单调队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 这个东西我弄得还不是很明白,所以先放一篇博客:https://www.cnblogs.com/I-Love-You-520/p/13454305.html

​ 单调队列说的就是博客中提到的场景,可以说解决的是固定长度,多次查询一段的最值(其实就是slice window的意思),这种如果是朴素算法的话,因为查一段序列的最值的时间复杂度是 O ( k ) O(k) O(k) (k 是序列长度),然后这段序列需要平移改变,所以外层有一个循环,这样复杂的就是 O ( n k ) O(nk) O(nk) (如果序列长为 n )。采用单调序列的方式,可以让时间复杂度下降到 O ( n ) O(n) O(n) 。单调队列的队头即为所求。

​ 此外,关于这篇博客的算法,其实队列中存储的是原数组的下标,而不是原数组元素的值。当然,如果写的更好一些,可以有一个封装,如下所示

typedef long long LL;
struct monotone_queue
{//单调队列
	int head,tail,id[N];
	LL d[N];

	inline void init()
    {
        // 这种方法处理感觉有点low,只是为了判断队空与否
		head = 1,tail = 0;
	}
	//v就是入队的值,x是数组索引(下标)
	inline void push(LL v,int x)
    {   //第一个参数为dp[i][x]
		while(head <= tail && d[tail] <= v)
            tail--;
		d[++tail] = v;
		id[tail]=x;
	}
	//x是数组索引
	inline void pop(int x)
    {//弹出,指的是当范围移动的时候,要把移出范围的元素删掉
		while( head <= tail && id[head] - x >= s)
            head++;
	}
}q;

​ 在这个代码里面,采用了两个数组,d 数组用来储存值(也就是队列功能,这个队列就是最丑陋的非循环队列),而 id 数组用来实现数组元素的移出。每次移动框,都是先插入,然后弹出。

​ 单调队列的队头指针指向队首元素,队尾指针指向队尾元素。出队操作可以发生在队头和队尾,入队操作只能发生在队尾,判断队空用的是 head <= tail。感觉十分丑陋。文章来源地址https://www.toymoban.com/news/detail-400862.html

到了这里,关于算法设计-单调队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【单调队列】 单调队列的“扫描线”理解

       “如果一个选手比你小还比你强,你就可以退役了。”——单调队列的原理 比你强,而且比你影响时间更长。 某种意义上,数学思维是生活中的思考的延伸。   算法学习笔记(66): 单调队列。引用 Pecco 的算法笔记。   在这里给出一种扫描线的理解。   我们以滑动

    2024年02月12日
    浏览(44)
  • C++ 单调队列 || 单调队列模版题:滑动窗口

    给定一个大小为 n≤106 的数组。 有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子: 该数组为 [1 3 -1 -3 5 3 6 7],k 为 3 。 窗口位置 最小值 最大值 [1 3 -1] -3 5 3 6 7 -1 3 1 [3 -1 -3] 5

    2024年01月20日
    浏览(39)
  • 单调队列&单调栈

    在一些问题中,可以使用单调队列或者单调栈优化 时间复杂度一般会被优化为 (O(n)) 单调队列: 队尾可以进队出队,对头可以出队(维护队列的单调性,往往会配合二分进一步降低时间复杂度) 队尾出队 的条件是:队列不空且新元素更优,队中的旧元素队尾出队 每个元素

    2024年02月05日
    浏览(36)
  • 【学习笔记】单调队列和单调栈

    以这道题为例:P5788。我们考虑维护一个单调栈,里面存的是下标,使里面的下标对应的元素从栈顶到栈底是单调上升的。 我们从 (nrightarrow 1) 枚举 (a_i) 对于每个 (i) ,如果栈非空,令栈顶的下标为 (j) ,若 (a_j) 不比 (a_i) 大,那么这个栈顶元素由于值又小,位置又靠

    2024年02月15日
    浏览(38)
  • 蓝桥杯每日一题----单调栈和单调队列

    单调栈即栈内的元素是单调递减或者单调递增的,我们通过一个题目来理解。 单调栈模板题 题目描述 给出项数为 n 的整数数列 a 1 … a n a_1…a_n a 1 ​ … a n ​ 。 定义函数 f ( i ) f(i) f ( i ) 代表数列中第 i 个元素之后第一个大于 a i a_i a i ​ 的元素的下标,即 f ( i ) = m i n i

    2024年02月19日
    浏览(41)
  • 辅助栈、单调栈与单调队列在lc中的应用

    三者都有何区别? 个人建议 单调栈/队列 中存放的元素最好是下标而不是值,因为有的题目需要根据下标计算,这样泛化性更好。参考lc239和lc496 大概的思路是先把不满足单调性的元素poll掉,然后offer一个当前符合条件的元素。参考lc239和lc496 // 说明:这里使用两个堆来维护

    2024年02月14日
    浏览(37)
  • leetcode分类刷题:队列(Queue)(一、单调队列)

    单调队列,看起来是与单调栈对应起来的一样;但是做题的时候感觉单调队列不像单调栈一样,能根据题意自然形成 单调队列的基本实现 ,感觉单调队列更像是和某个队列对应起来的一样 1、 单调队列的经典题型 :使用双向队列维护窗口,窗口移动的元素增删与队列的先进

    2024年02月09日
    浏览(40)
  • 单调队列

    2024年02月19日
    浏览(29)
  • 多重背包问题——单调队列优化

    我们在之前的文章中曾经讲解过多重背包问题,当时我们讲解了两种方法,一种方法就是三重循环,这种方法最为朴素好想。但是这种方法的时间复杂度非常高,后来我们想到了二进制优化的方式。那么今天我们将再介绍一种更好的优化方式——单调队列优化。 在讲解这种优

    2024年02月15日
    浏览(39)
  • 单调队列-滑动窗口最大值

    Problem: 239. 滑动窗口最大值 输入一个数组nums,滑动窗口k遍历该数组,输出得到的最大值数组; 示例1: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 构造一个单调队列表示当前窗口中单调递减的队列,队列的头就是最大值,为保证这个队列是窗口数据的表示,每次判断队

    2024年02月22日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包