力扣 滑动窗口最大值(用队列 + 不用队列,均可过)
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;}
};

相关内容

热门资讯

原创 C... 2026年2月9日,A股市场出现了一道奇观。 CPO概念板块午盘涨幅直接冲到了9.6%,接近涨停。 ...
原创 农... 鲁网2月11日讯近日,中国农业银行临沂开源支行大厅里迎来了一位特殊的顾客,一段特殊的服务故事正悄然温...
广州产投、工银投资、增城产投合... 天眼查APP显示,广州产投工融东进创新投资合伙企业(有限合伙)(以下简称“产投工融东进基金”)近日在...
原创 特... 美国在2025年12月启动关键矿产领域的新合作框架。那时,美国与几个国家代表共同签署一份声明,参与方...
网易CEO丁磊谈AI对游戏影响... 快科技2月12日消息,昨日,网易发布2025年Q4及全年财报,Q4营收275亿元,全年营收1126亿...
原创 3... 395:2!美国踩下金融核弹引信,中国去美元化进入读秒阶段 老铁们,2月9日这天,美国国会山那帮老爷...
国开行2025年发放超1.6万... 新华社北京2月11日电(记者张千千)记者2月11日从国家开发银行获悉,2025年,国开行发挥服务基础...
特斯拉副总裁等多名骨干离职、x... 当地时间2月9日,特斯拉副总裁拉吉·杰加纳坦在LinkedIn上宣布离职,结束了13年的特斯拉生涯。...
重庆A股34家上涨 国际复材、... 2月11日,79家重庆A股上市公司中有34家上涨,2家平收,下跌43家。 同花顺iFinD数据显示,...
央行:继续实施好适度宽松的货币... 中国人民银行2月10日发布《2025年第四季度中国货币政策执行报告》(下称《报告》)。对于下一阶段货...
原创 黄... 金价这轮过山车,表面是市场疯了,实质是体系在抖。黄金不是普通商品,它一旦“失控”,就等于有人在质疑美...
半导体ETF涨2.47%,能源... 半导体ETF涨2.47%,能源业ETF涨1.99%,全球科技股指数ETF涨1.7%,在美股盘初领跑行...
粤电力A:惠来电厂5、6 号机... 每经AI快讯,粤电力A2月11日晚间发布公告称,2026年2月11日,公司控股子公司广东粤电靖海发电...
陈博彰带队赴深圳招商考察 深化产业链合作 共谋“十五五”新篇 陈博彰带队赴深圳招商考察 长沙晚报掌上长沙2月11日深圳讯(特派...
原创 黄... 格局初定溯源头 想想1944年那时候,二战眼看就要收尾,美国拉着英国和其他国家,在布雷顿森林那个小...
华虹公司收购华力微议案获股东大... 2月10日,华虹公司(证券代码:688347.SH/1347.HK)召开2026年第一次临时(特别)...
年货消费体验升级!闪购年货、礼... 南都讯 深圳科技新年货热销大卖,各类智能终端产品,让新年有了新的科技质感。春节临近,年货“即买即用”...
原创 短... 周末的午后,家住北京朝阳区的张女士带着母亲留下的金手镯,兴冲冲地来到家附近的中国黄金门店,想着趁近期...
央视财经携手天眼查:用大数据解... 近日,由中央广播电视总台财经节目中心主办的《中国经济活力数据之夜》隆重举行,天眼查副总裁王雨霏受邀出...
实探!上海小南国一夜全城闭店,... 本报(chinatimes.net.cn)记者胡金华 上海摄影报道 2月6日晚间,上海知名餐饮企业小...