力扣 滑动窗口最大值(用队列 + 不用队列,均可过)
admin
2024-05-12 03:54:44
0

(最近在刷困难题,但是大部分和评论差不多,没有写题解的欲望,这道题,我看评论都是用队列写的,但是不用队列一样能过,所以我分别写下,用队列和不用队列的思路)

题目:
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。

题解:

① 用队列

首先,一眼优先队列,但是怎么移动窗口的时候怎么去除左边不需要的值呢,这时候我们可以用 set 来代替优先队列,那么我们怎么防止 set 去重呢,我们可以用 pair,同时存储值和下标,这样就不会去重了,接下来特简单,每次移动窗口,添加右边新增值,去掉左边不需要的值,然后取最大值即可

typedef pair P;
class Solution {
public:set

temp;vector res;vector maxSlidingWindow(vector& nums, int k) {for(int i = 0; i < k; i++) {temp.insert(make_pair(nums[i], i));}res.push_back(temp.rbegin() -> first);for(int i = k; i < nums.size(); i++) {temp.erase(make_pair(nums[i - k], i - k)); // 去除temp.insert(make_pair(nums[i], i)); 添加res.push_back(temp.rbegin() -> first); // 取范围最大值}return res;} };

但是这是可以优化的,我们还是可以用优先队列来写,细节是考虑加入值的大小,但这个评论区一堆,我就不细说了,可以看该题的评论区

② 不用队列

首先我看这个数的取值范围 -10 的四次方 到 10 的四次方,感觉肯定可以考虑从这里入手,不然为啥不取更大点的范围

那么我们构建一个数组 data[20005],这是所有数的取值范围,接下来,我们需要考虑这里面应该存的是什么情况的值,无非两种情况

一. 该窗口当前的情况
二. 整个数组的情况

假如是第一个情况,那么我们可以在数组中存方该范围的各个值的数量,但是这样我们怎样找到最大值呢?遍历?不可能,必超时。用线段树?也不行,复杂度跟上面差不多,没啥意义。

所以我们淘汰第一种情况,接下来考虑第二种情况,那么我们肯定不能只存各个值的数量,这个时候值的位置肯定也很重要,所以我们存的是该值的所有索引(用 vector 存)

那我们怎么利用这个值来进行操作呢,我们可以想到既然我们是要找范围最大值,那么此时所有值中的最大值,一定是它范围内的最大值,第二大的值则是除了最大值存在的范围的其他范围的最大值,那么依次这样下去,直到所有范围的最大值都被确定,这样是不是就有解了

接下来就是具体怎么操作了,我们当前值不能重复覆盖掉以前更大值所在的范围,那么我们可以用 bool 数组来存,是否被之前的更大值覆盖,然后直接跳过被覆盖过就行,每个值都考虑 k 次,这样很简单,但是会超时(亲测)

那这应该怎么办呢,我们就要考虑,我们用 bool 来存,会不会漏了什么信息没有保存,诶对了,我们可以把 bool 改为 int 来存当前位置覆盖到的之后最大位置,这样我们就不用一个个遍历,可以直接跳过了,这样改,就可以在规定时间内跑过了

typedef pair P;
class Solution {
public:int flag1 = 0;int flag2 = 0;vector res;vector ddd[20005];int mmm[100005];int fff[100005] = { 0 };vector maxSlidingWindow(vector& nums, int k) {for(int i = 0; i < nums.size(); i++) {ddd[nums[i] + 10000].push_back(i);flag2 = max(flag2, nums[i] + 10000);}while(flag1 < nums.size()) {while(ddd[flag2].empty()) {flag2--;}int f = ddd[flag2][ddd[flag2].size() - 1];int p = 0;while(p < k && f < nums.size()) {if(fff[f] != 0) {int temp = fff[f];fff[f] = k - p;p = p + temp;f = f + temp;}else{fff[f] = k - p;mmm[f] = flag2 - 10000;p++;f++;flag1++;}}ddd[flag2].pop_back();}for(int i = k - 1; i < nums.size(); i++) {res.push_back(mmm[i]);}return res;}
};

相关内容

热门资讯

原创 德... 在全球经济的复杂棋局中,近期德国总理默茨对人民币汇率的言论引发了不小的波澜。他声称人民币“低估了30...
煤科先锋丨从戈壁“小白”到攻坚... (来源:中国煤炭科工集团) 2022年初夏,刚入职不到半年的田凤亮,第一次踏上新疆戈壁深处的露天矿。...
海归博士回国创业,一年狂飙4倍... 文 | 硅基象限,作者 | 张思 一个50后海归博士,扎进全球仅剩三个玩家的“冷门”芯片赛道,做到...
3个月融资35亿,清华90后博... 极佳视界创始人 黄冠 作者 | 邱鑫浩 来源 | 邱处机 投资人正在押注物理AI的到来。 据《投资界...
12亿天价豪宅成交,又一个神秘... 文丨金融八卦女 月月 卖豪宅“续命”的大佬,又多了一个。 近日,香港地产圈诞生了2026年以来最贵...
今夜,欧美全线拉升!黄金白银,... 【导读】平静的一晚 中国基金报记者 泰勒 大家好啊,今晚美股休假,一起简单看看海外市场的表现吧。 7...
上半年880只新基成立创历史新... 财联社7月4日讯(记者 封其娟)2026 年上半年的公募发行市场,呈现出一幅“分裂式繁荣”的图景。 ...
“摘星脱帽”后连收两个涨停 金... 本报记者 冯雨瑶 7月3日,金科地产集团股份有限公司(以下简称“金科股份”)股价开盘后再度涨停,这是...
三重需求叠加,国产半导体设备企... 记者 郑晨烨 最近几个交易日,股票市场上近期涨势迅猛的科技股群体出现了快速回调。但在产业层面,202...
颈肩腰腿疼得扛不住?博康诊所贾... 现代保健报讯:朔州入了夏,白天热辣辣的,屋里空调一开,冷热交替间,不少人的颈肩腰腿又开始闹别扭了。鄯...
一张“小桌子”何以撬动大消费?... (来源:上海普陀) “太开心了!我是从常州特地来的,一年一次的展会,当然要过来感受一下!”上午10时...
2026四川行|从“四川行”看... 2026中外知名企业四川行投资推介会举行期间,四川重磅推出1.8万亿元投资机会,精选180个重点项目...
每周股票复盘:平安银行(000... 截至2026年7月3日收盘,平安银行(000001)报收于10.29元,较上周的10.23元上涨0....
电商爆款仪器怎么玩?公模现货在... 电商爆款仪器的核心竞争力不是重金投入外观私模,而是极致的供应链测款速度。数据显示,能在5天内完成现货...
起步价2000万的杭州豪宅成交... 界面新闻记者 | 杨冰柯 界面新闻编辑 | 庄键 上半年杭州新房成交2.62万套,总价2000万...
联易融:荣膺ESG可持续发展卓... 6月29日,由格隆汇主办的“中期策略峰会”揭晓“金格奖”年度卓越公司评选榜单,联易融科技集团(下称“...
腾讯、阿里、百度,历史性同台!... 每经编辑:金冥羽,陈俊杰,向江林 记者|郁彪 编辑|金冥羽 陈俊杰向江林 校对|张益铭 这是腾讯、...
3年赚46亿,杨幂喊出一个安徽... 国产零食品牌“溜溜梅”最近上市了。 6月15日,上市首日,溜溜梅的单日涨幅高达193.71%,超过此...
“甘肃银王”被查,“白银龙头”... “甘肃银王”栽了,“白银龙头“一泻千里。 2026年1月29日,盛达资源因为头顶“白银龙头”等热门概...
“霉霉”世纪婚礼耗资过亿!婚礼... (来源:中新文娱) Taylor Swift(霉霉)与美式足球员男友Travis Kelce,于当地...