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

相关内容

热门资讯

蜻蜓订购APP贵金属订购非法期...   蜻蜓订购APP以"投资平台"名义对外宣传,主打贵金属期货(订购)交易。该平台一方面强调自身"正规...
悟空订购APP非法期货交易欺骗...   近期,有投资者反映,“悟空订购APP”等平台以白银、贵金属订购为名,宣传所谓“高收益”“低门槛”...
小赢淘金APP期货投资骗局,平...   “小赢淘金”之流,最擅长的就是用“注册送现金”、“充值返券”的糖衣炮弹来引流。别天真地以为那是福...
八方淘金APP非法期货交易欺骗...   警惕!八方生财、每日淘金、小赢淘金、悟空订购、蜻蜓订购、斗金订购等APP均涉嫌非法期货交易!  ...
智易购APP贵金属订购交易骗局...   很多人看到“3元起投”“充值送福利”“操作简单”“随时提现”这类宣传,很容易把智易购APP当成普...
喜玛银庄APP商品订购投资骗局...   喜玛银庄APP白银、铂金“现货订购”骗局警示:无资质平台涉嫌非法期货交易,投资者爆仓后如何维权?...
吉鑫乐享APP炒贵金属订购交易...   近期,多名投资者反映在“吉鑫乐享APP”进行贵金属投资时遭遇严重亏损,甚至血本无归。看似正规的“...
易掘金APP虚假期货投资骗局,...   “易掘金”的APP它打着“高收益、灵活投资”的旗号,宣称通过“商品订购”就能轻松赚钱,吸引了不少...
在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...