首页 > 后端开发 > C++ > 正文

c++中如何实现滑动窗口最大值_c++滑动窗口最大值实现方法

穿越時空
发布: 2025-10-13 21:56:01
原创
563人浏览过
使用双端队列可在O(n)时间解决滑动窗口最大值问题:遍历数组,维护存储下标的deque,确保队首为当前窗口最大值下标,通过弹出过期和较小值元素保持单调性,窗口形成后记录结果。

c++中如何实现滑动窗口最大值_c++滑动窗口最大值实现方法

在C++中实现滑动窗口最大值,最高效的方法是使用双端队列(deque)来维护窗口内可能成为最大值的元素索引。这种方法可以在O(n)时间复杂度内解决该问题,避免对每个窗口都进行重复遍历。

使用双端队列实现滑动窗口最大值

核心思想是:用一个deque保存当前窗口中元素的下标,且保证队首始终是当前窗口最大值的下标。为了维持这一性质,需要按以下规则操作:

  • 遍历数组时,如果队列非空且队首元素已滑出窗口范围(即下标小于 i - k + 1),将其从队首弹出
  • 在将当前元素下标加入队列前,从队尾开始删除所有对应值小于等于当前元素值的下标,因为这些元素不可能再成为后续窗口的最大值
  • 将当前下标加入队尾
  • 当遍历到第k个元素及之后时,队首就是当前窗口最大值,记录结果

// 示例代码

include <vector>

include <deque>

using namespace std;

立即学习C++免费学习笔记(深入)”;

vector<int> maxSlidingWindow(vector<int>& nums, int k) { deque<int> dq; vector<int> result;

for (int i = 0; i < nums.size(); ++i) {
    // 移除超出窗口范围的索引
    if (!dq.empty() && dq.front() <= i - k)
        dq.pop_front();

    // 从队尾移除小于等于当前值的元素索引
    while (!dq.empty() && nums[dq.back()] <= nums[i])
        dq.pop_back();

    // 当前索引入队
    dq.push_back(i);

    // 窗口形成后开始记录最大值
    if (i >= k - 1)
        result.push_back(nums[dq.front()]);
}

return result;
登录后复制

}

ViiTor实时翻译
ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116
查看详情 ViiTor实时翻译

算法关键点说明

双端队列中存储的是下标而非数值,这样可以同时判断位置和取值。队列中的元素按对应数值单调递减排列,因此称为“单调队列”结构。这种设计确保了每次获取最大值的操作都是O(1)。

时间复杂度为O(n),每个元素最多入队和出队一次;空间复杂度为O(k),队列中最多保留k个元素。

边界情况处理

需要注意输入数组为空或k为0的情况,在函数开始处添加判空逻辑更健壮:

if (nums.empty() || k == 0) return {};

基本上就这些。使用deque实现的滑动窗口最大值方法高效且易于理解,适合在实际编程中直接应用。

以上就是c++++中如何实现滑动窗口最大值_c++滑动窗口最大值实现方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号