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

相关内容

热门资讯

海南自贸港“样板间”抢抓开放机... 中新网海口5月16日电 (记者 王子谦)洋浦经济开发区是海南自贸港“样板间”,也是外界观察自贸港建设...
净利增速2.98%,违规频发!... 近期,中信银行2025年年报与2026年一季报接连公布,报告显示,中信银行总资产站稳10万亿元台阶,...
原创 放... 全网的人几乎都在挤破头往海外大都市扎,可有一个女博主,却偏偏反着来。她拥有五百多万粉丝,本可以继续在...
原创 在... 在中国,买卖虚拟货币,到底行不行? 这个问题,很多人心里都犯嘀咕。有人说,法无禁止即可为;也有人说,...
龙粤慈善事业高质量发展与互联网... 近日,为加快培育数字慈善新生态,助力“善行边疆”活动走深走实,“龙粤慈善事业高质量发展与互联网公开募...
黄金大局已定:不出意外的话,2... 在投资领域,贵金属一直是备受关注的资产类别,尤其是黄金,其价格走势和投资价值牵动着无数投资者的心。随...
后巴菲特时代,伯克希尔哈撒韦新... 【导读】伯克希尔哈撒韦最新持仓公布!清仓亚马逊,建仓达美航空 中国基金报记者 张舟 伯克希尔哈撒韦“...
布朗46分胡金秋20+8 广厦... 【搜狐体育战报】北京时间5月16日CBA季后赛,主场作战的浙江浙商证券以111-102击败深圳马可波...
美联储任命鲍威尔担任临时主席 美国联邦储备委员会理事会5月15日发布公告,任命杰罗姆·鲍威尔担任美联储临时主席,直至凯文·沃什宣誓...
李从悠:白癜风患者,夏季防汗疹... 夏季高温多雨,白癜风患者皮肤屏障受损,出汗后汗液无法及时蒸发,易堵塞毛孔,诱发汗疹(热疹),汗疹引发...
最低涨价60元!4款非标茅台酒... 在飞天茅台涨价之后,部分非标茅台酒也提了价。 5月16日早间,贵州茅台自营渠道i茅台发布公告,宣布对...
邯郸10亿共享智造基金落地,撬... 图片为AI生成 据天眼查App显示,近日邯郸市共享智造股权投资基金(有限合伙)正式登记成立,总出资额...
AI制药行业深度:行业概况、市... 一、AI制药行业概况 1、AI药物研发概述 AI制药是指将NLP、深度神经网络,生成模型等AI技...
世界杯在即:国产彩电的出海故事... 球还没看,彩电先破防了 撰文/ 孟会缘 编辑/ 陈邓新 排版/ Annalee 国产彩电品牌,正深陷...
医疗健康领域投融资日报(5月1... 据亿欧数据统计,昨日(2026年5月15日)共披露16起投融资事件,涉及15家国内企业,1家国外企业...
深圳中创商业咨询携手海旗控股集... 海旗控股集团旗下宁波锦曼程新材料有限公司,自创立以来始终深耕高分子材料领域,秉承推动行业创新与可持续...
原创 关... 前言 大家好,我是老金。 国际地缘博弈的棋盘上,从来没有绝对的秘密,只有刻意或无意的战略试探,近期...
原创 欧... 今天来给大家聊一下最近的欧盟,自从特朗普说要来访华,欧洲的动作有点让人看不懂。从四月中旬到五月初,欧...
心系投资者 携手共行动 ——人... 为落实监管工作要求,切实维护金融消费者合法权益,在 “5・15 全国投资者保护宣传日” 当天,人保寿...
黄仁勋打卡蜜雪冰城 同款产品销... 财联社5月16日讯(记者 沈娇娇)5月15日上午,英伟达CEO黄仁勋现身北京南锣鼓巷,并且进入一家蜜...