最新要闻
- 热头条丨公积金月汇缴额是什么意思
- 当前热讯:用微信传播盗版电影被查:向两百多人分享《流浪地球2》《满江红》链接
- 新资讯:日本独居雌长臂猿突然产崽!孩子的父亲竟还是自己的“爷爷”
- 环球最新:Lady Gaga《小丑2》剧照首曝:疯狂的小丑女登场!
- 环球速讯:联想小新官宣接入百度“文心一言”:可在桌面一键直达
- 当前通讯!新能源车企现最大跌幅背后:涨价、营销、刺激消费的“国补退坡游戏”
- 观速讯丨一加显示器E 24上市:24寸IPS屏、18W PD输出
- 环球最新:网易代理《迷室3》《迷室:往逝》经典手游宣布停运:数据全清空
- 硬蹭名气?《中国式相亲2》非《中国式家长》团队作品
- 热议:桂格燕麦诞生于俄亥俄引网友关注 客服:产品与俄亥俄无关
- 环球微动态丨电量低于20%赶快充电!雅迪电动车保养攻略来了:关乎安全 车主必看
- 前沿热点:M值如何兑换话费
- 天天看热讯:想要模仿LPL,DRX赛后发漫画,却被Gen官方拉黑了?
- 焦点速读:Win11下月喜迎更新大礼包:10GB补丁 重启次数更少
- 【环球播资讯】员工发现老板娘偷看同事微信:火速离职
- 天天精选!车标成伤人凶器 日产召回超40万辆汽车
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
最资讯丨【LeetCode栈与队列#05】滑动窗口最大值
滑动窗口最大值
力扣题目链接(opens new window)
(资料图片)
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
进阶:
你能在线性时间复杂度内解决此题吗?
提示:
- 1 <= nums.length <= 10^5
- -10^4 <= nums[i] <= 10^4
- 1 <= k <= nums.length
思路
虽然本题在LeetCode上为困难级别,但是似乎很容易想到对应的暴力解法,首先我们得明白这题难在哪里
使用暴力解法
本题的难点在于使用一般的方法解,时间复杂度会很高
一种很自然的想法是:滑动窗口遍历过程中,我们又去遍历窗口内的数,比较大小后返回最大值
那么这种方法的时间复杂度为O(n*k),k为窗口大小,n为数组遍历次数
使用队列行不行?
观察滑动窗口移动的方式,和队列有点像
使用队列模拟滑动窗口,窗口每次向右移动一个单位,只需将队列的首位pop并将下一个数添加到队尾即可完成操作
那么可不可以用优先级队列来获取窗口内的最大值呢?
可以,但是会破坏窗口内元素的顺序,不利于后续操作
例如,当前窗口内的数为{1,3,-1}
如果将其放入优先级队列,那么顺序就会变为{3,1,-1}
很好,找到最大值3了。但是窗口向后移动时,按原来的设想,我们需要把1弹出,但是现在1被夹在中间,pop不了,出现问题。所以不能用优先级队列去做
自定义队列
逻辑
虽然不能用优先级队列去解决本题,但是这个思考过程是可以借鉴的
这里需要明确一点:队列中的元素顺序其实并不重要,队列只是用于模拟滑动窗口的一个数据结构
队列中数据的进出只需要满足滑动窗口移动的规则即可
因此,我们可以设想这样一种自定义队列:
该队列的队头永远是当前滑动窗口中的最大值,当滑动窗口移动时,我们就把新的数添加到队尾。
如果新数比队头的数还要大,那么将之前所有的队内元素弹出,使新数位于队头,如此循环
这种队列被称为单调队列
然后我们再通过一个函数去获取队列首部的最大值就可以实现题目的要求了,最终结果是{3,3,5,5,5,3}
总结一下,我们需要实现的队列结构大致如下:
class MyQueue {public: void pop(int value) { } void push(int value) { } int front() { return que.front(); }};
实现
那么想法有了,用什么数据结构去实现这个单调队列呢?--> deque
实现单调队列MyQueue
如上面说的,单调队列类MyQueue中提供pop、push、front三个方法
pop
用于弹出元素
每次弹出之前要先判断当前队列是否为空,以及输入值是否与队头数据相等
void pop(int value){ if(!que.empty() && value == que.front()){ que.pop_front();//弹出队首元素 }}
如果要pop的元素是队首元素,说明当前最大值需要更新,并且该更新是因为窗口移动导致的,而不是来了个新的最大值
简单来说,不是每次滑动窗口移动都需要调用pop,pop函数只负责单纯的pop掉队列开头的元素
如果有新的数值进来并且是最大值,那么将新的最大值移动到队首的操作会由push函数实现
push
用于将新元素添加到队尾
void push(int value){ while(!que.empty() && value > que.back()){//如果新元素一直大于队尾的数,就不断将队尾数pop que.pop_back(); } //直到遇到比新元素更大的值或者只剩下新元素 que.push_back(value);}
front
用于查询队列头部的元素
// 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。 int front() { return que.front(); }
完整代码
class MyQueue {public: deque que; void pop(int value) { if(!que.empty() && value == que.front()){ que.pop_front();//弹出队首元素 } } void push(int value) { while(!que.empty() && value > que.back()){//如果新元素一直大于队尾的数,就不断将队尾数pop que.pop_back(); } //直到遇到比新元素更大的值或者只剩下新元素 que.push_back(value); } int front() { return que.front(); }};
整体代码
步骤:
1、使用deque实现单调队列MyQueue
2、实例化单调队列
3、将整数数组中k(窗口大小)个元素遍历加入队列中
4、res记录当前k个数中的最大值
5、开始移动窗口遍历整数数组
- 使用pop配合push模拟窗口的滑动
- 记录当前最大值
6、返回结果数组res
class Solution {private: class MyQueue{ public: deque que; void pop(int value){ if(!que.empty() && value == que.front()){ que.pop_front();//弹出队首元素 } } void push(int value){ while(!que.empty() && value > que.back()){//如果新元素一直大于队尾的数,就不断将队尾数pop que.pop_back(); } //直到遇到比新元素更大的值或者只剩下新元素 que.push_back(value);//注意用的是自己实现的push,不是push_back } int front(){// 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。 return que.front(); } };public: vector maxSlidingWindow(vector& nums, int k) { MyQueue que; //输出值是数组 vector res; //将滑动窗口初始位置的值加入 for(int i = 0; i < k; ++i){ que.push(nums[i]); } //记录当前最大值 res.push_back(que.front()); //模拟窗口移动 for(int i = k; i < nums.size(); ++i){//注意从k开始 que.pop(nums[i - k]);//将窗口最前面的数pop掉 que.push(nums[i]);//往窗口末尾加入新数,使窗口向右移动 res.push_back(que.front());//记录当前窗口的最大值 } return res; }};
主函数部分说明
主函数逻辑:
1、实例化MyQueue、结果数组vector res;
2、初始化滑动窗口,即先使用自定义的push(不是push_back)把数组前k个数放入队列(同时就排好序了)
3、将当前初始化窗口的最大值保存(用vector提供的方法:push_back)
4、模拟窗口移动(注意遍历开始的位置,以及窗口头部和尾部位置)
补充知识
vector添加元素用push_back,deuqe也用这个
TBD
最资讯丨【LeetCode栈与队列#05】滑动窗口最大值
如何优雅的在 Word 中添加漂亮的代码?
今日热文:2023.02.15.差分
热头条丨公积金月汇缴额是什么意思
当前热讯:用微信传播盗版电影被查:向两百多人分享《流浪地球2》《满江红》链接
新资讯:日本独居雌长臂猿突然产崽!孩子的父亲竟还是自己的“爷爷”
环球最新:Lady Gaga《小丑2》剧照首曝:疯狂的小丑女登场!
环球速讯:联想小新官宣接入百度“文心一言”:可在桌面一键直达
当前通讯!新能源车企现最大跌幅背后:涨价、营销、刺激消费的“国补退坡游戏”
【环球速看料】数据类型之字符串、数据类型之列表、数据类型之字典、数据类型之布尔值、数据类型之元组、数据类型之集合、与用户交互、格式化输出、基本运算符
每日热讯!数字化开采|AIRIOT智慧矿山自动化生产解决方案
全球视讯!wagger也不好用了!API文档还得是Apipost
世界信息:Web 页面之间传递参数
Java开发工具IntelliJ IDEA 2020.2完整授权流程
观速讯丨一加显示器E 24上市:24寸IPS屏、18W PD输出
环球最新:网易代理《迷室3》《迷室:往逝》经典手游宣布停运:数据全清空
硬蹭名气?《中国式相亲2》非《中国式家长》团队作品
热议:桂格燕麦诞生于俄亥俄引网友关注 客服:产品与俄亥俄无关
环球微动态丨电量低于20%赶快充电!雅迪电动车保养攻略来了:关乎安全 车主必看
前沿热点:M值如何兑换话费
焦点观察:记录--『uni-app、小程序』蓝牙连接、读写数据全过程
全球速看:PostgreSQL重要参数解析及优化
天天新动态:openeuler加载dpdk驱动模块
【全球报资讯】(数据库系统概论|王珊)第三章关系数据库标准语言SQL-第六、七节:视图
环球热头条丨【算法训练营day44】完全背包基础 LeetCode518. 零钱兑换II LeetCode377. 组合总和IV
天天看热讯:想要模仿LPL,DRX赛后发漫画,却被Gen官方拉黑了?
焦点速读:Win11下月喜迎更新大礼包:10GB补丁 重启次数更少
【环球播资讯】员工发现老板娘偷看同事微信:火速离职
天天精选!车标成伤人凶器 日产召回超40万辆汽车
索尼降噪耳机新秀!WH-CH720N意外偷跑:升级蓝牙5.2
大国重器 首台国产HA级重型燃机下线:未来将100%零排放
焦点!字体查看小工具 -- (采用wpf开发)
【算法训练营day43】LeetCode1049. 最后一块石头的重量II LeetCode494. 目标和 LeetCode474. 一和零
每日看点!独立包装:大牌N95口罩25片9.9元到手
环球观速讯丨贾跃亭名下已无财产可执行:无车辆、不动产
【环球报资讯】苹果逐渐向OLED过渡!替换掉mini LED
世界消息!羊毛没了 Steam阿根廷区《卧龙》价格暴涨一倍
焦点讯息:一看就能装!奇瑞iCar原厂趣改套件上市:3389元起
你应该知道的微信小程序游戏技术❗️❗️
【算法题--异或操作】找出数组中唯一没有重复的那个元素
极兔一面:Dockerfile如何优化?注意:千万不要只说减少层数
环球时讯:怎样的目标管理能真正实现目标?做到这3点就对了
开心档之Java 流(Stream)、文件(File)和IO
【焦点热闻】舍利子制作方法居然也有发明专利 网友:得道高僧等级速升外挂
世界即时:跑腿师傅诉苦:男子订一束花送五个女生均被拒 还被扣款差评
微软将用UUP方式推送.NET更新:“可选更新”终于可控
钉钉iOS版喜迎更新:支持定时消息 再不怕打扰别人休息了
天天热讯:《星际争霸2》新晋中国世界冠军李培楠:别给暴雪送钱 不要买!
天天最新:CSS 盒模型和 box-sizing 属性
环球讯息:全志h616,Ubuntu,python3.9环境搭建
【全球新要闻】【关系型数据库】事务特性及事务隔离级别
软件自动化测试高频面试题
环球百事通!游戏帧数暴增84% 英特尔锐炫显卡新老驱动对比
当前动态:山东多人无视劝阻赶海 1人溺水遇难:必须小心这4点
世界即时看!价值7万的爱马仕包运输途中被烧毁!顺丰:如果是我们的问题 会进行处理
天天速看:男子给女友转账140万分手想要回:女方最终被判返还40万
每日热门:媒体曝苹果扩大在印产量障碍重重:这品控看完避雷
新资讯:时隔多年,这次我终于把动态代理的源码翻了个地儿朝天
环球速读:AI照骗恐怖如斯!美女刷屏真假难辨 网友:警惕AI网恋诈骗
【全球时快讯】万元级最香!ROG四款满血笔记本齐上阵:魔霸新锐2023首发9999元手慢无
SQL工具性能实测:居然比Navicat还快,数百万行数据导出仅51秒
当前要闻:从上至下遍历二叉树---队列的性质
全球焦点!00后男生长期把可乐当水喝:牙全坏
《巫师3》次时代版热修复上线:解决4.01版性能问题
MINI纯电Countryman谍照
世界简讯:贾跃亭再被执行2.4亿:总额超42亿!自称FF91四月交付
车主称凯迪拉克新车刹车失灵高速上撞车 网友:这次支持4S
焦点要闻:xxl-job~为宿主机添加定时备份数据库的程序
扬汤止沸是什么意思?扬汤止沸是做功还是热传递?
生活中测量质量的工具有哪些?生活中测量质量的工具研究背景
每日观点:199元!小米30W无线车充开售:电动夹臂 iPhone也能用
天天快资讯:荣耀Magic5系列样张首曝光 AI无人抓拍或刷新拍照速度革命 2月27日全球发布!
全球头条:首发7999起 机械师曙光16 Pro开启预售:可选13代i9+RTX 4070
通讯!13倍浓缩:日本隅田川胶囊咖啡1.2元/杯大差价抄底
你最信任哪家快递公司?数千网友近一半投票给了它
露蜂房和蜂房有什么区别?露蜂房的功效和作用是什么?
漫画长歌行的结局是什么?漫画长歌行什么时候恢复更新?
汉武帝叫什么名字?汉武帝之后的皇位顺序
屏幕分辨率调不了是什么原因?屏幕分辨率调不了怎么解决?
荣事达手机怎么刷机?荣事达手机所有型号
海尔洗衣机e4怎么解决?海尔洗衣机故障代码大全
上海和首尔哪个更发达?上海和首尔咖啡馆数量
骁龙616处理器怎么样?骁龙616处理器相当于麒麟多少?
环球要闻:矩阵中的路径
当前速读:CF1753EF
环球微资讯!机器学习-决策树
三分钟使用chatGPT
全球观天下!关于Linux从内核启动选项中开启对ipv6的支持
京东券在哪里领?京东券怎么使用?
压力给到合资燃油车!比亚迪秦PLUS DM-i冠军版上市5天订单破2.5万
每日热闻!真我GT Neo5成为史上最畅销的安卓1TB手机:首销被抢购一空
热点!非机械键盘不买?你可能不了解薄膜键盘
天天报道:一箱油跑1100km 五菱凯捷混动铂金版将上市:演员周迅成首位车主
控制空调、收音机 无缝显示油量!全新一代苹果Carplay年底推出
全球百事通!面试官:Lambda 表达式中的 forEach 如何提前终止?这次被问倒了!
天天讯息:从青铜到王者,揭秘 Serverless 自动化函数最佳配置
Linux常用命令
微资讯!转移国内工厂 彻底摆脱中国制造?印度坑惨苹果 iPhone良品率不到50%
环球快播:一次性带走29包 奥利奥缤纷零食大礼包狂促:券后29.9元
世界滚动:比小米猛!曝Redmi K60将推出1TB版本:彻底解决微信存储焦虑