滑动窗口------滑动窗口最大值

🔥个人主页: Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

给定一个整数数组 nums 和滑动窗口大小 k,窗口从数组最左侧移动到最右侧,返回每个窗口中的最大值。

核心思路:单调队列

暴力解法的时间复杂度是 \(O(nk)\),在数据量大时会超时。我们可以用单调队列将时间复杂度优化到 \(O(n)\)。

为什么选择单调队列

  • 队列里存储的是数组下标,而非具体数值
  • 队列中的下标对应的数组值是单调递减的
  • 队首元素始终是当前窗口的最大值

代码逐行解析

cpp

复制代码
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> ans(n - k + 1); // 结果数组大小为窗口数量
        deque<int> q; // 双端队列,存储下标

        for (int i = 0; i < n; i++) {
            // 1. 维护队列单调性:移除队尾所有小于当前元素的下标
            while (!q.empty() && nums[q.back()] <= nums[i]) {
                q.pop_back();
            }
            q.push_back(i);

            // 2. 移除窗口外的队首元素
            int left = i - k + 1; // 当前窗口的左边界
            if (q.front() < left) {
                q.pop_front();
            }

            // 3. 当窗口形成时,记录最大值
            if (left >= 0) {
                ans[left] = nums[q.front()];
            }
        }
        return ans;
    }
};

关键步骤拆解

  1. 维护队列单调性

    • 新元素进入时,从队尾开始移除所有比它小的元素
    • 这样可以保证队列里的元素始终是单调递减的
    • 队首元素永远是当前窗口的最大值
  2. 移除窗口外的元素

    • 每次移动窗口后,检查队首元素是否还在窗口范围内
    • 如果队首元素的下标小于窗口左边界,就将其弹出
  3. 记录窗口最大值

    • 当窗口左边界 left >= 0 时,说明窗口已经形成
    • 此时队首元素就是当前窗口的最大值,直接存入结果数组

复杂度分析

  • 时间复杂度:\(O(n)\)。每个元素最多被加入和弹出队列各一次,总操作次数为 2n
  • 空间复杂度 :\(O(k)\)。队列中最多存储 k 个元素
相关推荐
Easy_API5 小时前
2.8万亿参数,编程反超GPT-6 Astra:Kimi K3.1 Pro把开源模型推到了哪一步
大数据·人工智能·gpt·深度学习
GlobalInfo5 小时前
2026年机器人多指灵巧手市场分析报告——涵盖行业调查、趋势分析与发展前景
大数据·人工智能·microsoft·微服务·机器人
代码山河5 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行5 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
梯度下降者6 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
微订校园外卖平台7 小时前
校园外卖平台选模板还是定制:架构、数据流与验收清单
大数据·架构·外卖系统·本地生活·微订
UIU1147 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
“AI国潮设计-小江”7 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
论文复现现场8 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi8 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构