使用双端队列维护单调递增索引序列可高效实现滑动窗口最小值,遍历数组时维护队列单调性并移除超范围元素,每步将队首最小值加入结果,时间复杂度O(n)。

在C++中实现滑动窗口最小值,常用的方法是使用双端队列(deque)来维护窗口内元素的索引,保证队首始终是当前窗口的最小值。这种方法时间复杂度为O(n),每个元素最多入队出队一次。
使用双端队列维护单调递增序列
核心思想是维护一个单调递增的双端队列,存储的是数组下标而非元素值,这样能判断元素是否还在窗口范围内。
具体操作如下:
遍历数组时,如果队列非空且队尾对应元素大于等于当前元素,则从队尾弹出,保持队列单调性将当前元素下标加入队尾检查队首元素是否已滑出窗口(下标小于 i – k + 1),若超出则从队首弹出当遍历到第k个元素后,每步将队首对应值加入结果
示例代码:
立即学习“C++免费学习笔记(深入)”;
#include
#include
using namespace std;
vector slidingWindowMinimum(const vector& nums, int k) {
deque dq;
vector result;
for (int i = 0; i // 移除队尾比当前元素大的索引,保持递增
while (!dq.empty() && nums[dq.back()] >= nums[i])
dq.pop_back();
// 加入当前索引
dq.push_back(i);
// 移除超出窗口范围的队首元素
if (dq.front() dq.pop_front();
// 窗口形成后记录最小值
if (i >= k – 1)
result.push_back(nums[dq.front()]);
}
return result;
}
处理边界情况
需要注意输入合法性判断,比如窗口大小k大于数组长度或k为0的情况。
可以在函数开头添加检查:
if (nums.empty() || k nums.size())
return {};
实际应用场景
该方法适用于需要频繁查询滑动区间最值的问题,如数据流中的局部最小值、图像处理中的滤波窗口等。双端队列法比暴力解法(每次遍历窗口找最小)效率更高,适合大规模数据处理。
基本上就这些,关键在于理解队列中维护的是可能成为最小值的候选索引,而不是所有元素。
以上就是c++++中如何实现滑动窗口最小值_c++滑动窗口最小值实现方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1477747.html
微信扫一扫
支付宝扫一扫