【单调队列】-----【原理+模版】

单调队列

一、什么是单调队列?

单调队列是一种在滑动窗口或区间查询中维护候选元素单调性的数据结构,通常用于解决“滑动窗口最大值/最小值”等问题。

核心思想是:利用双端队列(deque)维护当前窗口内或候选范围内元素的下标,使队列内对应的值保持单调(递减或递增),从而能在常数时间内获得当前窗口的最值,且整体复杂度为线性级别。


二、核心概念与原理分析

1. 作用场景:滑动窗口问题

  • 常见题型:给定数组 a [ 1.. n ] a[1..n] a[1..n](或 0-based,但此处示例统一使用 1-based,下同),和窗口大小 k k k,要求对每个长度为 k k k 的子数组(窗口)求最大值/最小值。
  • 其他场景:可扩展到动态维护区间最值,或在线流数据的最值维护等。
  • 单调队列的出现是为了解决滑动窗口中暴力方法 O ( n k ) O(nk) O(nk) 的低效问题,将其优化到 O ( n ) O(n) O(n)

2. 为什么要用双端队列(deque)

  • 存下标,不直接存值

    • 存下标可以方便判断元素是否落在当前窗口范围;
    • 若只存值,则无法快速删除过期元素(窗口左边界移出后的元素)。
  • 双端队列(deque)的特点

    • 可以在两端高效入队出队;
    • 既需要在尾部插入当前元素下标,也需要在头部删除过期下标;
    • 在维护单调性时还要在尾部弹出不符合条件的下标。

3. 单调性:决定入队前的弹出策略

  • 目标问题分两类:

    • 滑动窗口最大值 → 维护单调递减队列(队头值最大)。
    • 滑动窗口最小值 → 维护单调递增队列(队头值最小)。
  • 维护方式

    1. 入队新下标 i i i,先在队尾弹出所有“相对于当前需求无用”的下标:

      • 对于最大值:弹出所有 a [ 队尾下标 ] ≤ a [ i ] a[ \text{队尾下标}] \le a[i] a[队尾下标]a[i]
      • 对于最小值:弹出所有 a [ 队尾下标 ] ≥ a [ i ] a[\text{队尾下标}] \ge a[i] a[队尾下标]a[i]
    2. 弹出后,队尾剩余下标对应的值严格保持单调(递减或递增)。

    3. 再将下标 i i i 加入队尾。

  • 弹出理由(以最大值为例)

    • 当遍历到 i i i,若队尾下标 j j j 满足 a [ j ] ≤ a [ i ] a[j] \le a[i] a[j]a[i],则:

      1. 对于当前窗口包含 i i i 的场景, j j j 不可能成为最大值候选,因为 a [ i ] a[i] a[i] 更大且更“靠右”(即更新到最新位置);
      2. 对于后续窗口中更右的位置,若某窗口包含 j j j 且也包含更右的 i i i,由于 i i i 更新得更近且更大, j j j 永远无法胜过 i i i 成为最大;
      3. 因此可安全剔除 j j j,保证队列中只保留可能成为窗口最大值的候选。
    • 同理,对于最小值,弹出所有 a [ j ] ≥ a [ i ] a[j] \ge a[i] a[j]a[i]

4. 窗口滑动与过期元素删除

  • 过期元素指的是下标小于当前窗口左边界的元素下标。

  • 在每次移动窗口时(通常是遍历到下标 i i i 时,窗口左边界为 i − k + 1 i-k+1 ik+1),需要检查队头:

    • 若 队头下标 < i − k + 1 i-k+1 ik+1,说明该下标对应的元素已不在当前窗口范围,应从队头弹出;
    • 重复检查直到队头下标在窗口范围内或队列为空。
  • 这样保证队头始终对应当前窗口内候选中最符合单调性且最“老”的(最可能是最大/最小)的下标。

5. 遍历顺序与入队时机

  • 通常对滑动窗口问题,我们从左向右遍历下标 i = 1 … n i = 1 \dots n i=1n

    1. 入队前先处理过期(当 i ≥ k i \ge k ik 时,左边界为 i − k + 1 i-k+1 ik+1),删除队头过期下标;
    2. 维护单调性:弹出队尾所有无效下标,再将 i i i 入队尾;
    3. 获取答案:当 i ≥ k i \ge k ik 时,队头即为窗口 [ i − k + 1 , i ] [i-k+1, i] [ik+1,i] 的最值下标,可通过 a [ 队头 ] a[\text{队头}] a[队头] 获取最大/最小值;
    4. 继续下一个 i i i
  • 注意先删除过期,再维护单调,再读取答案可避免使用已过期下标或使新元素干扰答案顺序错误。

6. 不变量(Invariant)描述

以“滑动窗口最大值”+从左向右遍历为例,在处理下标 i i i 之前,假设已维护到 i − 1 i-1 i1

  • 队列中存储的均为下标 ≥ i − k + 1 \ge i-k+1 ik+1(即未过期);
  • 队列中对应的 a [ ⋅ ] a[\cdot] a[] 值从队头到队尾严格递减;
  • 队头是上一个窗口(若 i − 1 ≥ k i-1 \ge k i1k 则窗口 [ i − k , i − 1 ] [i-k, i-1] [ik,i1])的最大值下标,且队列中剩余元素都是对未来窗口可能有用的候选。
    处理 i i i 时:
  1. 弹出过期:若队头 < i − k + 1 i-k+1 ik+1,出队;

  2. 弹出无用:弹出所有 a [ 队尾 ] ≤ a [ i ] a[\text{队尾}] \le a[i] a[队尾]a[i]

  3. 入队 i i i:将 i i i 加入队尾;

  4. 记录答案:若 i ≥ k i \ge k ik,此时队头即为窗口 [ i − k + 1 , i ] [i-k+1, i] [ik+1,i] 最大值下标。

    该流程保证了当前及后续窗口的正确性和数据结构的不变量。

7. 严格/非严格比较与等值处理

  • 常见实现中,使用 <=(最大值场景)或 >=(最小值场景)将等值元素也弹出:

    • 结果是:在队列中保留距离更近(更靠右或更晚出现)的下标,避免当值相等时用更早出现的下标做答案而导致不必要影响;
    • 适合“严格取更大或更小”的要求;若题目对等值有特别要求(如“当相等时保留最早/最晚”),可调整为 <>
  • 示例:若希望当新的值等于队尾值时仍保留旧下标,可在弹出条件中改为 <,使得相等时不弹出旧下标。

8. 复杂度保证

  • 每个下标最多入队一次、出队(无用弹出或过期删除)一次 → O ( 2 n ) O(2n) O(2n) 次队列操作 → 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( n ) O(n) O(n) 用于存放下标的 deque 以及输入数组、结果数组。

三、完整代码示例(数组下标从 1 开始)

1. 滑动窗口最大值示例(模板+详解)

#include <iostream>
#include <vector>
#include <deque>
using namespace std;// 示例:给定数组 a[1..n],和窗口大小 k,输出每个长度为 k 的子数组的最大值
int main() 
{ios::sync_with_stdio(false);cin.tie(nullptr);int n, k;cin >> n >> k;// 使用 1-based 存储,方便理解;注意读入时按 a[1..n]vector<int> a(n + 1);for (int i = 1; i <= n; i++) {cin >> a[i];}// 结果:存每个窗口最大值;如果需要下标,可以另存下标//长度为n的数组,最多能划分n-k+1个长度为k的窗口vector<int> ans(n-k+1);// 单调队列:deque 存放下标,保证 a[deque.front()] 是当前窗口最大值deque<int> dq;// 遍历方向:从左向右,i 表示当前考察的下标for (int i = 1; i <= n; i++) {// 1. 删除过期元素:若队头在窗口左边界之外,弹出// 当前窗口为 [i-k+1, i](当 i >= k 时有效)if (!dq.empty() && dq.front() < i - k + 1) {// 弹出所有过期下标,通常只需一次检查即可,因为队头最老dq.pop_front();}// 2. 维护单调性:弹出所有 a[队尾] <= a[i]while (!dq.empty() && a[dq.back()] <= a[i]) {dq.pop_back();}// 3. 将当前下标 i 入队尾dq.push_back(i);// 4. 记录答案:当窗口形成(i >= k)时,队头即最大值下标if (i >= k) {ans.push_back(a[dq.front()]);// 如果题目需要输出下标,可用 dq.front()}}// 输出结果:根据题目要求格式,这里逐行输出for (int v : ans) {cout << v << "\n";}return 0;
}

详细注释说明:

  • 为什么先 if (dq.front() < i-k+1) pop_front():保证队头元素在当前窗口;当 i < k 时,此条件不会触发,也不会记录答案。
  • 为什么弹出 <=:剔除所有值不大于当前值的候选,保证队列单调递减,队头始终是最大。
  • 为什么在 i >= k 时读取答案:窗口 [ i − k + 1 , i ] [i-k+1,i] [ik+1,i] 完成后,才有完整长度 k k k;读取时队头一定是该窗口最大。
  • 入队时机放在读取答案之前也可,但必须保证读取时队列已维护好单调性和过期删除;此处先维护、再读取,保证清晰。
  • 若需要获取最大值下标,可记录 dq.front();若只需值,直接用 a[dq.front()]

2. 滑动窗口最小值示例

#include <iostream>
#include <vector>
#include <deque>
using namespace std;// 示例:给定数组 a[1..n],和窗口大小 k,输出每个长度为 k 的子数组的最小值
int main() 
{ios::sync_with_stdio(false);cin.tie(nullptr);int n, k;cin >> n >> k;vector<int> a(n + 1);for (int i = 1; i <= n; i++) {cin >> a[i];}// 结果:存每个窗口最大值;如果需要下标,可以另存下标//长度为n的数组,最多能划分n-k+1个长度为k的窗口vector<int> ans(n-k+1);// 单调递增队列:保证 a[dq.front()] 是当前窗口最小值deque<int> dq;for (int i = 1; i <= n; i++) {// 1. 删除过期下标if (!dq.empty() && dq.front() < i - k + 1) {dq.pop_front();}// 2. 维护单调性:弹出所有 a[队尾] >= a[i]while (!dq.empty() && a[dq.back()] >= a[i]) {dq.pop_back();}// 3. 入队dq.push_back(i);// 4. 记录答案if (i >= k) {ans.push_back(a[dq.front()]);}}for (int v : ans) {cout << v << "\n";}return 0;
}

注:与最大值模板对称,只需将比较方向反转。


四、完整样例模拟

以数组 a = [ 5 , 2 , 6 , 1 , 4 , 3 ] a=[5,2,6,1,4,3] a=[5,2,6,1,4,3](1-based,下标 1…6),窗口大小 k = 3 k=3 k=3,演示“滑动窗口最大值”:

  • 窗口序列:

    1. 窗口 [ 1 , 3 ] [1,3] [1,3],元素 5 , 2 , 6 {5,2,6} 5,2,6
    2. 窗口 [ 2 , 4 ] [2,4] [2,4],元素 2 , 6 , 1 {2,6,1} 2,6,1
    3. 窗口 [ 3 , 5 ] [3,5] [3,5],元素 6 , 1 , 4 {6,1,4} 6,1,4
    4. 窗口 [ 4 , 6 ] [4,6] [4,6],元素 1 , 4 , 3 {1,4,3} 1,4,3

初始化:dq = [], ans = []

Step i=1, a [ 1 ] = 5 a[1]=5 a[1]=5

  • 处理前:dq=[]
  • 删除过期:窗口尚未形成(i<k),跳过
  • 维护单调:dq 为空,无需弹出
  • 入队:dq=[1]
  • 不记录答案(i<3)

Step i=2, a [ 2 ] = 2 a[2]=2 a[2]=2

  • 处理前:dq=[1]
  • 删除过期:i<3,不触发
  • 维护单调:检查队尾下标1,对应 a [ 1 ] = 5 > 2 a[1]=5 > 2 a[1]=5>2,不弹
  • 入队:dq=[1,2]
  • 不记录答案(i<3)

队列含下标 [1(5), 2(2)],值单调递减。


Step i=3, a [ 3 ] = 6 a[3]=6 a[3]=6

窗口形成: [ 1 , 3 ] [1,3] [1,3],元素 5 , 2 , 6 {5,2,6} 5,2,6

  • 处理前:dq=[1,2]

  • 删除过期:i=3,k=3,左界=1,dq.front()=1,不过期

  • 维护单调:

    • 队尾2对应 a [ 2 ] = 2 ≤ 6 a[2]=2 \le 6 a[2]=26 → 弹出 → dq=[1]
    • 新队尾1对应 a [ 1 ] = 5 ≤ 6 a[1]=5 \le 6 a[1]=56 → 弹出 → dq=[]
  • 入队:dq=[3]

  • 记录答案:窗口 [1,3] 最大值下标 dq.front()=3,值 6ans=[6]


Step i=4, a [ 4 ] = 1 a[4]=1 a[4]=1

窗口形成: [ 2 , 4 ] [2,4] [2,4],元素 2 , 6 , 1 {2,6,1} 2,6,1

  • 处理前:dq=[3]
  • 删除过期:左界=4-3+1=2,dq.front()=3 ≥2,不过期
  • 维护单调:队尾3对应 a [ 3 ] = 6 > 1 a[3]=6 >1 a[3]=6>1,不弹
  • 入队:dq=[3,4]
  • 记录答案:窗口 [2,4] 最大值下标3,值6 → ans=[6,6]

队列 [3(6),4(1)] 。


Step i=5, a [ 5 ] = 4 a[5]=4 a[5]=4

窗口形成: [ 3 , 5 ] [3,5] [3,5],元素 6 , 1 , 4 {6,1,4} 6,1,4

  • 处理前:dq=[3,4]

  • 删除过期:左界=5-3+1=3,dq.front()=3 ≥3,不过期

  • 维护单调:

    • 队尾4对应 a [ 4 ] = 1 ≤ 4 a[4]=1 \le4 a[4]=14 → 弹出 → dq=[3]
    • 新队尾3对应 a [ 3 ] = 6 > 4 a[3]=6 >4 a[3]=6>4 → 停止
  • 入队:dq=[3,5]

  • 记录答案:窗口 [3,5] 最大值下标3,值6 → ans=[6,6,6]

队列 [3(6),5(4)] 。


Step i=6, a [ 6 ] = 3 a[6]=3 a[6]=3

窗口形成: [ 4 , 6 ] [4,6] [4,6],元素 1 , 4 , 3 {1,4,3} 1,4,3

  • 处理前:dq=[3,5]
  • 删除过期:左界=6-3+1=4,dq.front()=3 <4 → 过期,弹出 → dq=[5]
  • 维护单调:队尾5对应 a [ 5 ] = 4 > 3 a[5]=4 >3 a[5]=4>3,不弹
  • 入队:dq=[5,6]
  • 记录答案:窗口 [4,6] 最大值下标5,值4 → ans=[6,6,6,4]

最终 ans=[6,6,6,4],对应每个窗口最大值正确无误。


五、总结

1. 单调队列的本质

通过双端队列维护当前窗口或候选区间内元素的下标,并保证对应值单调(递减或递增),在 O ( 1 ) O(1) O(1) 时间内获取最大/最小值,同时整体遍历只做 O ( n ) O(n) O(n) 操作。


2. 关键点

  • 明确需求:是求最大值还是最小值;是否对等值有特殊处理(严格/非严格);
  • 存下标:方便检查过期与结果输出;
  • 删除过期:在每次滑动到新下标 i i i 时,先判断并删除队头下标是否 < 当前窗口左界;
  • 维护单调:根据需求在入队前弹出所有不符合单调性的候选;
  • 答案获取时机:当 i ≥ k i \ge k ik 时读取队头作为该窗口结果;
  • 细致考虑边界:例如当 k > n k>n k>n k = 1 k=1 k=1(此时每个元素即窗口自身)、空数组等场景;
  • 空间/时间保证:每个元素下标最多入队一次、出队一次,保证线性时间;队列最坏空间 O ( k ) O(k) O(k)

3. 问题模型总结

问题目标遍历方向数据结构维护单调过期删除读取答案
滑动窗口最大值从左向右deque存下标单调递减(值)队头 < i-k+1 时 pop_fronti ≥ k 时,值 a[dq.front()]
滑动窗口最小值从左向右deque存下标单调递增(值)同上同上(最小值)
可扩展:动态区间最值根据场景deque或分块等原理类似根据移动方式调整获取方式视场景而定

4. 快速记忆口诀

滑动窗口 → 从左向右遍历;

最大值 → 单调递减队列;
最小值 → 单调递增队列;

先过期,后入队,最后读队头。

  • “滑动窗口”:意味着需要随下标 i 逐步移动窗口左界 i-k+1 → 从左向右逐步遍历;

  • “最大/最小”:决定弹出条件:

    • 最大:弹出所有 ≤ 当前值;
    • 最小:弹出所有 ≥ 当前值;
  • “过期删除”:每次 i 进来前/或后,判断队头是否过期并删除,确保队头始终在窗口内;

  • “答案读取”:当 i ≥ k,队头即窗口最值。


5. 常见变体与注意事项

  1. 0-based 写法:若数组 a[0…n-1] 且下标从 0 开始,窗口左界为 i-k+1,判断过期时条件改为 dq.front() < i-k+1(与 1-based 逻辑一致);注意初始化和结果索引偏移。

  2. 等值策略:根据题意调整弹出条件中的等号:

    • 若希望当新值等于队尾值时保留旧下标,可改为 while (!dq.empty() && a[dq.back()] < a[i])
    • 若希望淘汰旧下标,用 <=
  3. 同时维护最值和次值:某些题需同时获得最大值和次大值,可能需要更复杂结构。但基础是单调队列思想,可结合其它数据结构;

  4. 多维或其他滑动窗口:如二维滑动窗口(矩阵卷积最值),可结合行/列的单调队列两次应用;

  5. 在线数据流:若数据流不断到来,只需按到达顺序往 deque 插入,并删除过期即可;

  6. 其他类型区间维护:单调队列原理也能用于解决某些 DP 中需要维护区间最值或极值差分问题(如“窗口最值应用于最优转移”),思路类似。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84260.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS语法中的选择器与属性详解

CSS:层叠样式表&#xff0c;Cascading Style Sheets 层叠样式表 内容和样式分离解耦&#xff0c;便于修改样式。 特殊说明&#xff1a; 最后一条声明可以没有分号&#xff0c;但是为了以后修改方便&#xff0c;一般也加上分号为了使用样式更加容易阅读&#xff0c;可以将每条代…

模拟设计的软件工程项目

考核题目 论文论述题&#xff1a;结合你 参与开发、调研或模拟设计的软件工程项目 &#xff0c;撰写一篇论文 完成以下任务&#xff0c;论文题目为《面向微服务架构的软件系统设计与建模分析》&#xff0c;总分&#xff1a; 100 分。 1. 考核内容&#xff1a; 一、系统论述…

个人理解redis中IO多路复用整个网络处理流

文章目录 1.redis网络处理流2.理解通知机制 1.redis网络处理流 10个客户端通过TCP与Redis建立socket连接&#xff0c;发送GET name指令到服务器端。服务器端的网卡接收数据&#xff0c;数据进入内核态的网络协议栈。Redis通过IO多路复用机制中的epoll向内核注册监听这些socket的…

【郑州轻工业大学|数据库】数据库课设-酒店管理系统

该数据课设是一个基于酒店管理系统的数据库设计 建库语句 create database hotel_room default charset utf8 collate utf8_general_ci;建表语句 use hotel_room;-- 房型表 create table room_type( id bigint primary key auto_increment comment 房型id, name varchar(50)…

TCP 三次握手与四次挥手详解

前言 在当今互联网时代&#xff0c;前端开发的工作范畴早已超越了简单的页面布局和交互设计。随着前端应用复杂度的不断提高&#xff0c;对网络性能的优化已成为前端工程师不可忽视的重要职责。而要真正理解并优化网络性能&#xff0c;就需要探究支撑整个互联网的基础协议——…

RTD2735TD/RTD2738 (HDMI,DP转EDP 高分辨率高刷新率显示器驱动芯片)

一、芯片概述 RTD2738是瑞昱半导体&#xff08;Realtek&#xff09;推出的一款高性能显示驱动芯片&#xff0c;专为高端显示器、便携屏、专业显示设备及多屏拼接系统设计。其核心优势在于支持4K分辨率下240Hz高刷新率及8K30Hz显示&#xff0c;通过集成DisplayPort 1.4a与HDMI …

C++实现手写strlen函数

要实现求字符串长度的函数&#xff0c;核心思路是通过指针或索引遍历字符串&#xff0c;直到遇到字符串结束标志 \0 。以下是两种常见的实现方式&#xff1a; 指针遍历版本 #include <iostream> using namespace std; // 指针方式实现strlen size_t myStrlen(const cha…

NVPL 函数库介绍和使用

文章目录 NVPL 函数库介绍和使用什么是 NVPLNVPL 的主要组件NVPL 的优势安装 NVPL基本使用示例示例1&#xff1a;使用 NVPL RAND 生成随机数示例2&#xff1a;使用 NVPL FFT 进行快速傅里叶变换 编译 NVPL 程序性能优化建议总结 NVPL 函数库介绍和使用 什么是 NVPL NVPL (NVI…

HTTP相关内容补充

目录 一、URI 和 URL 二、使用 Cookie 的状态管理 三、返回结果的 HTTP状态码 一、URI 和 URL URI &#xff1a;统一资源标识符 URL&#xff1a;统一资源定位符 URI 格式 登录信息&#xff08;认证&#xff09;指定用户名和密码作为从服务器端获取资源时必要的登录信息&a…

MySQL: Invalid use of group function

https://stackoverflow.com/questions/2330840/mysql-invalid-use-of-group-function 出错SQL: 错误原因&#xff1a; 1. 不能在 WHERE 子句中使用聚合&#xff08;或分组&#xff09;函数 2. HAVING 只能筛选分组后的聚合结果或分组字段 # Write your MySQL query statem…

C#财政票查验接口集成-医疗发票查验-非税收入票据查验接口

财政票据是企事业单位、医疗机构、金融机构等组织的重要报销凭证&#xff0c;其真实性、完整性和合规性日益受到重视。现如今&#xff0c;为有效防范虚假票据报销、入账、资金流失等问题的发生&#xff0c;财政票据查验接口&#xff0c;结合财政票据识别接口&#xff0c;旨在为…

浏览器基础及缓存

目录 浏览器概述 主流浏览器&#xff1a;IE、Chrome、Firefox、Safari Chrome Firefox IE Safari 浏览器内核 核心职责 主流浏览器内核 JavaScript引擎 主流的JavaScript引擎 浏览器兼容性 浏览器渲染 渲染引擎的基本流程 DOM和render树构建 html解析 DOM 渲染…

Ubuntu 安装Telnet服务

1. 安装Telnet 客户端 sudo apt-get install telnet 2. 安装Telnet 服务器 &#xff08;这样才能用A电脑的客户端连接B电脑的Telnet服务&#xff09; sudo apt-get install telnetd 3. 这时候Telnet服务器是无法自我启动的&#xff0c;需要网络守护进程服务程序来管理…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月19日第113弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。 (1)定…

观察者模式 vs 发布订阅模式详解教程

&#x1f31f;观察者模式 vs 发布订阅模式详解教程 收藏 点赞 关注&#xff0c;持续更新高频面试知识库&#xff01;&#x1f680; 一、核心概念&#xff08;总&#xff09; 在软件开发中&#xff0c;观察者模式&#xff08;Observer&#xff09; 和 发布订阅模式&#xff0…

【云馨AI-大模型】MD2Card:从Markdown到知识卡片的完美转变

Markdown的魅力与挑战MD2Card的核心功能使用体验与案例分析总结 在当今这个信息快速传播的时代&#xff0c;内容创作者们一直在寻找更有效的方式来呈现他们的想法和知识。无论是为了个人学习笔记、团队内部的知识分享还是对外的内容发布&#xff0c;一个清晰、美观的展示方式显…

【实战教程】OPEN API 雷池社区版自动拉黑IP

老版本使用雷池社区版的时候都需要在界面操作&#xff0c;但是网络攻击往往都是无规律的&#xff0c;每次都手动操作非常累 前一段时间雷池社区版刚好开放了OPEN API 功能&#xff0c;可以支持大家使用API的方式进行管理了 但是没有相关文档非常难受&#xff0c;一直没有使用…

Hot100——链表专项

目录 相交链表 反转链表 回文链表 环形链表 合并两个有序链表 相交链表 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if (headA nullptr || headB nullptr) {return nullptr;}ListNode *pA headA;ListNode *pB headB;while (pA ! pB) {pA (pA…

Java + Spring Boot 后端防抖切面类AOP代码问题排查分析

需排查分析的防抖切面类 AOP代码&#xff1a; package com.weiyu.aop;import com.weiyu.anno.Debounce; import com.weiyu.utils.DebounceUtil; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotatio…

【FreeRTOS-信号量】

参照正点原子以及以下gitee笔记整理本博客&#xff0c;并将实验结果附在文末。 https://gitee.com/xrbin/FreeRTOS_learning/tree/master 一、信号量简介 1、什么是信号量 答&#xff1a;信号量是一种解决同步问题的机制&#xff0c;可以实现对共享资源的有序访问。 假设有…