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

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

穿越時空
发布: 2025-10-06 13:44:02
原创
922人浏览过
使用双端队列维护单调递增索引序列可高效实现滑动窗口最小值,遍历数组时维护队列单调性并移除超范围元素,每步将队首最小值加入结果,时间复杂度O(n)。

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

在C++中实现滑动窗口最小值,常用的方法是使用双端队列(deque)来维护窗口内元素的索引,保证队首始终是当前窗口的最小值。这种方法时间复杂度为O(n),每个元素最多入队出队一次。

使用双端队列维护单调递增序列

核心思想是维护一个单调递增的双端队列,存储的是数组下标而非元素值,这样能判断元素是否还在窗口范围内。

具体操作如下:

  • 遍历数组时,如果队列非空且队尾对应元素大于等于当前元素,则从队尾弹出,保持队列单调性
  • 将当前元素下标加入队尾
  • 检查队首元素是否已滑出窗口(下标小于 i - k + 1),若超出则从队首弹出
  • 当遍历到第k个元素后,每步将队首对应值加入结果

示例代码:

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

啵啵动漫
啵啵动漫

一键生成动漫视频,小白也能轻松做动漫。

啵啵动漫 298
查看详情 啵啵动漫

#include <vector>
#include <deque>
using namespace std;

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

    for (int i = 0; i < nums.size(); ++i) {
        // 移除队尾比当前元素大的索引,保持递增
        while (!dq.empty() && nums[dq.back()] >= nums[i])
            dq.pop_back();

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

        // 移除超出窗口范围的队首元素
        if (dq.front() <= i - k)
            dq.pop_front();

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

处理边界情况

需要注意输入合法性判断,比如窗口大小k大于数组长度或k为0的情况。

可以在函数开头添加检查:

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

实际应用场景

该方法适用于需要频繁查询滑动区间最值的问题,如数据流中的局部最小值、图像处理中的滤波窗口等。双端队列法比暴力解法(每次遍历窗口找最小)效率更高,适合大规模数据处理。

基本上就这些,关键在于理解队列中维护的是可能成为最小值的候选索引,而不是所有元素。

以上就是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号