新闻中心

c++中如何使用栈实现滑动窗口最小值_c++栈实现滑动窗口最小值

2025-11-05
浏览次数:
返回列表
答案:使用双端队列维护单调递增序列,遍历时移除过期下标和较大值下标,窗口形成后队首即为最小值。例如输入 nums = [2,1,3,-1,-2,5,4], k = 3,输出 [1,-1,-2,-2,-2],时间复杂度 O(n)。

c++中如何使用栈实现滑动窗口最小值_c++栈实现滑动窗口最小值

在 C++ 中,可以使用双端队列(deque)结合栈的思想来高效实现滑动窗口最小值问题。虽然题目提到“栈”,但实际更合适的数据结构是双端队列,因为它支持两端操作,能模拟单调栈的行为。

问题描述

给定一个数组和窗口大小 k,找出所有滑动窗口中的最小值。例如:nums = [2, 1, 3, -1, -2, 5, 4], k = 3输出: [1, -1, -2, -2, -2]

使用双端队列模拟单调栈

核心思想是维护一个递增的双端队列(单调队列),队首始终是当前窗口的最小值下标。具体步骤如下:
  • 遍历数组,用双端队列存储元素的下标,保证对应值递增
  • 如果队首下标已不在当前窗口内,弹出队首
  • 从队尾向前删除所有对应值大于等于当前值的下标(保持递增)
  • 将当前下标加入队尾
  • 当窗口形成后(i >= k-1),记录队首对应的值为最小值

C++ 实现代码

以下是完整实现:

// 滑动窗口最小值实现
#include
#include
using namespace std;

vector minSlidingWindow(vector& nums, int k) {
vector result;
deque dq; // 存储下标,保证对应值递增

for (int i = 0; i // 移除不在窗口内的下标
while (!dq.empty() && dq.front() 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;
}

关键点说明

虽然称为“栈实现”,但本质是利用双端队列维护单调性:
  • pop_back 相当于栈的弹出,用于维护递增性质
  • push_back 是常规插入
  • pop_front 处理滑出窗口的元素
时间复杂度 O(n),每个元素最多入队出队一次。

基本上就这些。用 deque 模拟单调栈行为是解决滑动窗口最值的标准做法,效率高且易于理解。

刺鸟创客 刺鸟创客

一款专业高效稳定的AI内容创作平台

刺鸟创客 110 查看详情 刺鸟创客

以上就是c++++中如何使用栈实现滑动窗口最小值_c++栈实现滑动窗口最小值的详细内容,更多请关注其它相关文章!


# 最多  # 外贸网站设计优化策略  # 建设小学官方网站  # 新蔡附近推广营销  # 北京seo营销方案  # 射阳摄影网站建设  # 网站建设个人工作  # 推广快手作品网站  # 汝州网站建设推广  # 洪湖网站建设制作  # 网站seo建设方案  # 遍历  #   # 调试器  # 什么用  # 弹出  # 移除  # 数据结构  # 递归  # 如何使用  # 最小值  # win  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  iCloud登录入口网页版 苹果iCloud官网登录  期待已久:小米17 Ultra、小米首款NAS本月登场  Go Martini框架:动态服务解码后的图片内容  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  生成rdflib自定义SPARQL函数:参数匹配与实践指南  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  内存检查:在VS Code中调试C++时的内存视图  汽水音乐在线版入口_汽水音乐网页播放手册  红果短剧网页版官网入口 官方最新网址发布  在WordPress中通过REST API获取BasicAuth保护的远程文章  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  知音漫客正版漫画平台_知音漫客官网账号登录  在Pyomo中实现基于变量的条件约束:Big-M方法详解  Promise错误处理:在catch后终止链式then执行的策略  PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  零跑汽车11月交付量达70327台 实现连续9个月正增长  sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  如何使用Go和Martini动态服务解码后的图片  Fabric模组开发:自定义物品与物品组的现代管理方法  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  Lar*el 递归关系中排除指定分支的教程  J*aScript中高效管理与清空动态列表:避免循环陷阱  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  优化Django表单:提交验证失败后保留用户输入  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  Typer应用中灵活处理命令行参数的令牌化与解析  Golang如何安装Swagger工具_GoSwagger文档生成环境  Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突  解决Python logging 中 datefmt 导致时间戳固定不变的问题  Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  Go语言JSON解析深度指南:动态访问与结构体映射实践  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  C++如何生成随机数_C++ random库使用方法与范围设置  微博网页版首页入口 微博电脑端官网登录链接  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法 

搜索