测温(单调队列练习)

本文介绍了单调队列这一数据结构及其在解决滑动窗口最大值问题中的应用。通过维护队列的单调性,可以高效地找到每个窗口内的最大值。在状态转移过程中,使用类似双端队列的方法更新队列,保持队列从队首到队尾递减,从而确保队首元素始终为最大值。此外,还讨论了如何通过状态转移公式来优化算法,并提供了一个全局标记来简化加1操作。

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

在这里插入图片描述
在这里插入图片描述

单调队列(经典问题:滑动窗口最大值)

  • 和单调栈类似的数据结构
  • 经典问题:滑动窗口最大值:给出一个可能包含重复的整数数组,和一个大小为 k 的滑动窗口, 从左到右在数组中滑动这个窗口,找到数组中每个窗口内的最大值。
  • 单调队列中的元素是严格单调的。我们在求解这个问题的时候需要维护他的单调性。
  • 队首元素即为当前位置的最大值。假设要求滑动窗口中的最大值。我们就需要确保滑动窗口中的元素从队首到队尾是递减的。
  • 每滑动一次就判断当前元素和队尾元素的关系,如果放入队尾满足单调递减,那么放入即可;如果放入不满足,就需要删除队尾元素直到放入当前元素之后满足队列单调递减。同时要确保已经出窗口的最大值(队首元素)被删除掉。
  • 设单调队列中的元素用<>表示
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

思路

  • (关键)划分解空间:令DP[i][k]DP[i][k]DP[i][k],以第i个段为结尾,且第i个段取值为k时候的不下降的连续天数(以第i个段为结尾)

  • 状态转移:
    DP[i][j]=maxk≤jDP[i−1][k]+1DP[i][j] = max_{k \leq j} DP[i-1][k] + 1DP[i][j]=maxkjDP[i1][k]+1
    如果不存在这样的k那么取值为0。显然k取能够取得最大值即可。

  • 随着j的提升,DP[i][j]DP[i][j]DP[i][j]是单调不减的(由定义很容易看到)

  • 状态转移(如图所示):
    在这里插入图片描述

  • 对于每个i值,使用类似双端队列或单调队列的方式维护段的取值即可。

    • 加1可使用一个全局标记,代表该队列中所有的值都已经被加上某个数字
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值