单调队列 & 单调栈

本文介绍了单调队列和单调栈的数据结构,它们的特点是下标和值都单调递增。通过这些特性,文中展示了如何高效地在给定数组中找到某个区间内的最大值以及右边界值的插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单调队列

一种下标单调,值也单调的队列。

以长度为 kkk 的区间内最大值为例,在一个数进队时,可以知道在他之前的肯定下标比他小,所以如果前面的数比他小,那么前面的数肯定不能成为最大值,直接出队,如果前面的数比他大,因为前面的数下标靠前,所以这个数有可能在以后成为最大值,将其加入队列,对于不合法的位置,直接出队。

for(int i = 1; i <= n; i ++){
  while(head <= tail && a[i] >= a[q[tail]]){
    tail --;
  }
  q[++ tail] = i;
  while(head <= tail && q[tail] - q[head] + 1 > m){
  	head ++;
  }
  if(i >= m){
    cout << a[q[head]] << " ";
  } 
}

单调栈

一种下标单调,值也单调的栈。

以右边第一个比他大的数为例,对于一个数 xxx,如果 xxx 大于栈顶的值,那么栈顶右边第一个比他大的数即为 xxx,最后将 xxx 压入栈。

因为栈内下标、值都单调,所以如果栈顶没找到,那么栈顶下面的肯定也没找到。

stack <int> stk;
for(int i = 1; i <= n; i ++){
	while(!stk.empty() && a[i] > a[stk.top()]){
		R[stk.top()] = i;
		stk.pop();
	}
	stk.push(i);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值