千家信息网

如何使用C++求滑动窗口最大值

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要为大家展示了"如何使用C++求滑动窗口最大值",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何使用C++求滑动窗口最大值"这篇文章吧。一、题目
千家信息网最后更新 2026年11月01日如何使用C++求滑动窗口最大值

这篇文章主要为大家展示了"如何使用C++求滑动窗口最大值",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何使用C++求滑动窗口最大值"这篇文章吧。

一、题目描述

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置                 最大值---------------               -----[1  3  -1] -3  5  3  6  7       3 1 [3  -1  -3] 5  3  6  7       3 1  3 [-1  -3  5] 3  6  7       5 1  3  -1 [-3  5  3] 6  7       5 1  3  -1  -3 [5  3  6] 7       6 1  3  -1  -3  5 [3  6  7]      7示例 2:输入:nums = [1], k = 1输出:[1]示例 3:输入:nums = [1,-1], k = 1输出:[1,-1]
提示:1 <= nums.length <= 10e5-10e4 <= nums[i] <= 10e41 <= k <= nums.length

二、题解

(1) 暴力遍历法

这种方法思路比较简单、直接:从左向右依次滑动窗口的过程中,计算每一次的最大值,存入ans中。

class Solution {         public:vector maxSlidingWindow(vector& nums, int k) {         vector ans;int max;for(int i=0; imax)max = nums[j];}ans.push_back(max);}return ans;}};

这种方法时间复杂度O(nk),会超出时间限制,因此需要进行一些优化!

(2) 优先队列

对于本题,两个相邻(只差了一个位置)的滑动窗口,它们共用着 k-1 个元素,而只有 1个元素是变化的,我们可以根据这个特点进行优化。

优先队列priority_queue与普通队列queue的不同之处在于,它包含的最大值元素位于队首,因此这是一种非常合适解决此类问题的数据结构。

C++中,优先队列priority_queue类的具体用法可参见:【C++养成计划】队列 -- 快速上手STL queue类(Day13)

对于本题而言,具体步骤是:

  • 将数组 nums 的前 k 个元素放入优先队列中,并找出第一个窗口的最大值,存入ans中

  • 向右移动窗口时,把一个新的元素放入优先队列中,此时堆顶的元素就是堆中所有元素的最大值。

  • 根据最大元素的索引号判断:该元素是否属于该窗口内,从而删除不属于当前窗口的所有较大值。直到最大值属于当前的窗口,该值极为当前窗口的最大值。

class Solution {         public:vector maxSlidingWindow(vector& nums, int k) {         int n = nums.size();priority_queue> q;// 将数组 nums 的前 k 个元素放入优先队列中for (int i = 0; i < k; ++i) {         q.emplace(nums[i], i);}vector ans = {         q.top().first};for (int i = k; i < n; ++i) {         // 把一个新的元素放入优先队列中q.emplace(nums[i], i);while (q.top().second <= i - k) {         // 如果优先队列的最大值不属于当前窗口,则删掉该最大值q.pop();}// 剩下的里面最大值即可ans.push_back(q.top().first);}return ans;}};

复杂度分析:

  • 时间复杂度:O(nlogn),其中 n 是数组 nums 的长度。由于将一个元素放入优先队列的时间复杂度为 O(logn),因此总时间复杂度为 O(nlogn)。

  • 空间复杂度:O(n),即为优先队列需要使用的空间。

注:这里所有的空间复杂度分析都不考虑返回的答案需要的 O(n) 空间,只计算额外的空间使用。

以上是"如何使用C++求滑动窗口最大值"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

最大 最大值 元素 队列 复杂 复杂度 数组 C++ 时间 空间 内容 示例 篇文章 移动 输入 输出 位置 方法 本题 分析 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网加科技 亿人帮互联网科技有限公司 广州紫鲸互联网科技有限公司 国智互联网科技 智能科技公司是互联网公司吗 互联网科技公司怎么样 互联网未来科技 远拓互联网科技 碳银互联网科技有限公司 猫创互联网科技 四个字互联网科技公司取名 成都仁贤领冠互联网科技有限公司 互联网 科技馆 成都铂石互联网科技做什么的 米聚互联网科技南京有限公司排面 工业互联网展湾科技股份有限公司 南通创西澳互联网科技有限公司 互联网企业科技类企业如何做账 上海互联网科技公司ppt 宁波跨境商互联网科技有限公司 花魁咖啡 互联网科技股 蓝思科技飞鸽互联网 工业互联网科技新基建 银优互联网科技有限公司 互联网科技的未来发展 深圳国际航运科技和互联网 美国五大互联网科技公司市值多少 山东亿川互联网科技有限责任公司 如何强化互联网金融科技
0