当前位置: 首页 > news >正文

C++面试题(46)------滑动窗口的最大值

  • 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

题目描述、

定一个数组 nums 和一个大小为 k 的滑动窗口,窗口每次向右移动一位,请找出所有窗口中的最大值。

示例:

输入: nums = [1,3,-1,-3,5,3,6,7], k = 3
输出: [3,3,5,5,6,7]

解法思路:单调队列

这是一个非常经典的滑动窗口 + 单调队列应用题。
🔍 核心思想:

使用一个双端队列 deque 来维护当前窗口中可能成为最大值的元素索引,并保证队列头部始终是当前窗口的最大值索引。
具体步骤如下:

  • 遍历数组,维护一个窗口大小为 k 的滑动窗口;
  • 对于每个新元素:
    • 移除队列中不在窗口内的索引(超出窗口左边界);
    • 移除队列中比当前元素小的值(因为它们不可能再成为最大值);
    • 将当前元素索引入队;
    • 当窗口满足大小 k 时,记录队列头部元素作为当前窗口最大值。

实现代码


#include <deque>
#include <vector>
using namespace std;class Solution {
public:vector< int > maxSlidingWindow( vector< int >& nums, int k ){vector< int > result;deque< int > dq;  // 存储索引,对应值从大到小for ( int i = 0; i < nums.size(); ++i ){// 移除不在窗口内的索引while ( !dq.empty() && dq.front() < i - k + 1 )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;}
};int main()
{Solution s;vector<int> nums = { 1, 3, -1, -3, 5, 3, 6, 7 };int k = 3;vector<int> result = s.maxSlidingWindow( nums, k );for ( int i = 0; i < result.size(); i++ )cout << result[ i ] << " ";
} 

运行结果

3 3 5 5 6 7

相关文章:

  • 淘宝做轮播广告哪个网站好南平网站seo
  • 合肥做网站首选 晨飞网络2022百度seo优化工具
  • 设计网站怎么做网络推广是啥
  • 信息化建设 网站域名注册管理中心网站
  • wordpress 菜单 链接地址seo站内优化技巧
  • iis网站防盗链百度投诉中心热线
  • vue 路由学习
  • Python核心库Pandas详解:数据处理与分析利器
  • 【最新实时目标检测YOLOv13添加PyQt可视化界面】
  • 旁挂式集中转发AC基础配置
  • 对手机屏中断路和短路的单元进行切割或熔接,实现液晶线路激光修复原理
  • 《贵州棒垒球》有什么国家级比赛·棒球1号位
  • Qt面试题汇总
  • 集成 Odoo、n8n 与 Dify,实现智能业务流程自动化
  • 通过环境变量管理多版本JDK8、11、17并安装idea编译器
  • 第十节 新特性与趋势-CSS层叠规则升级
  • WPF 几种绑定 (笔记)
  • Docker 安装与配置 详解——AI教你学Docker
  • 实物建模性能优化秘籍:如何将模型面数减少且保持质感
  • 实现OFD转换PDF文件的实用方法
  • 计算机基础和Java编程的练习题
  • (LeetCode 每日一题) 2200. 找出数组中的所有 K 近邻下标 (双指针)
  • CasaOS中Docker部署SyncThing结合Cpolar实现公网文件同步方案
  • Kafka 监控与调优实战指南(二)
  • 华为云Flexus+DeepSeek征文 | 华为云MaaS平台上的智能客服Agent开发:多渠道融合应用案例
  • 《高并发系统的一致性保障:RocketMQ事务消息实现原理与应用》