当前位置: 首页 > news >正文

优化技巧--滑动窗口

目录

1.滑动窗口的作用

2.核心步骤📍

3.代码模板

4.手动演示推导过程📍

5.例题


1.滑动窗口的作用

维护数组中特定区间(窗口)内元素特性(如最大值、最小值、和)。

2.核心步骤📍

步骤 1:初始化数据结构

  • 双端队列 deque<int> q:存储元素下标,确保队列中对应的元素值单调递减(维护最大值)或递增(维护最小值)。

  • 结果数组 vector<int> res:存储每个窗口的极值。

步骤 2:遍历数组

对每个元素执行以下操作:

步骤 3:移除窗口外的过期元素

  • 若队头元素下标小于当前窗口左边界 i - k + 1,说明该元素已超出窗口范围,弹出队头。

  • 作用:确保队列中的元素均在当前窗口内。

步骤 4:维护队列单调性

  • 维护最大值(降序队列)若当前元素 nums[i] 大于等于队尾元素对应的值,则弹出队尾,直到队列为空或队尾元素值大于 nums[i]

  • 维护最小值(升序队列)若当前元素 nums[i] 小于等于队尾元素对应的值,则弹出队尾,直到队列为空或队尾元素值小于 nums[i]

  • 作用:确保队列中的元素值单调递减 / 递增,队头即为当前窗口的极值。

步骤 5:当前元素入队

将当前元素下标 i 加入队尾。

步骤 6:窗口形成后记录结果

  • 当遍历到第 k-1 个元素后,窗口大小达到 k,开始记录队头元素对应的值作为当前窗口的极值。

3.代码模板

#include <vector>
#include <deque>
using namespace std;// 滑动窗口最大值模板
vector<int> slidingWindowMax(const vector<int>& nums, int k) {deque<int> q; // 存储下标,队首始终是窗口的最大值下标vector<int> res;int n = nums.size();for (int i = 0; i < n; ++i) {// 移除窗口外的元素(左端点滑出)while (!q.empty() && q.front() <= i - k)q.pop_front();// 保持队列单调递减while (!q.empty() && nums[q.back()] <= nums[i])q.pop_back();// 当前元素入队q.push_back(i);// 记录当前窗口的最大值(队首为最大值)if (i >= k - 1) // 确保窗口已经形成res.push_back(nums[q.front()]);}return res;
}

4.手动演示推导过程📍

nums = [1, 3, -1, -3, 5, 3, 6, 7]
k = 3

    5.例题

    http://www.lqws.cn/news/138223.html

    相关文章:

  1. Golang——7、包与接口详解
  2. c++第6天--运算符重载
  3. return this;返回的是谁
  4. 散货拼柜业务:多货主财务结算如何高效管理?
  5. machine_env_loader must have been assigned before creating ssh child instance
  6. 开源模型应用落地-OpenAI Agents SDK-集成Qwen3-8B-function_tool(二)
  7. 【HarmonyOS 5】游戏开发教程
  8. C++初阶 | 模板
  9. 《复制粘贴的奇迹:小明的原型工厂》
  10. 人工智能:网络安全的“智能守护者”
  11. 驱动:字符设备驱动注册、读写实操
  12. Visual Studio C++ 调试日志与异常定位指南
  13. Spring BeanPostProcessor
  14. 大数据学习(130)-zookeeper
  15. 深度解析ArrayList
  16. LLM:Scaling Law
  17. java判断一个字符串(如 str1)是否在给定的一组字符串
  18. el-table 树形数据,子行数据可以异步加载
  19. Vue指令修饰符、v-bind对样式控制的增强、computed计算属性、watch监视器
  20. Deepfashion2 数据集使用笔记
  21. MyBatis-Plus LambdaQuery 高级用法:JSON 路径查询与条件拼接的全场景解析
  22. sqli-labs靶场38-45关(堆叠注入)
  23. 2025年五一数学建模竞赛A题-支路车流量推测问题详细建模与源代码编写(一)
  24. fmod产生的误差应该如何解决?
  25. Android studio初体验
  26. yoloe优化:可支持点提示进行检测分割
  27. AI系统提示词:Claude 4 Opus
  28. 《PyTorch Hub:解锁深度学习模型的百宝箱》
  29. Linux网络socket套接字(上)(2)
  30. 【Linux】线程同步