代码随想录--数组--滑动窗口解决最长/短子数组题型
创始人
2024-05-31 02:13:09
0

注意题目是说找连续数组的和>=s的最小长度,是“和”,不然都不知道题目在说什么。

http://【拿下滑动窗口! | LeetCode 209 长度最小的子数组】 https://www.bilibili.com/video/BV1tZ4y1q7XE/?share_source=copy_web

看一下暴力算法,暴力算法是用两个for循环,一个循环起始位置,一个循环终止位置。进入第一个循环起始位置固定,然后进入第二个循环终止位置遍历数组去寻找>=s的数组,然后再进入第一个循环起始位置移动,终止位置再遍历数组去寻找此位置为起始位置的和>=s的数组,如此下去。

接下来是滑动窗口,滑动窗口其实和双指针有点相似,滑动窗口方法用一个for循环解决暴力算法中两个for循环。

首先要弄清楚:

①滑动窗口的for循环里for(j..)循环的j指的是起始位置还是终止位置?

假设是起始位置,那为了寻找出和>=s的数组,终止位置就需要遍历数组,那起始位置每移动一个,终止位置就得遍历一遍数组,那就和暴力算法一样了需要两个循环,那就不是滑动窗口了。

所以这里要注意,这个循环的j指的是终止位置。

②那起始位置应该怎么动什么时候应该移动?这个是滑动窗口里很重要的。

for循环,终止位置不断往右移动,当起始位置和终止位置之间的数组和>=s,起始位置就得往右移动了,为什么?

因为如果起始位置还不动,而终止位置继续往右移动,因为此时这道题数组里是正数,所以长度肯定越来越大,可是我们要找的是最短长度啊,所以这样是无意义的嘛。所以此时应该是终止位置暂时别动,起始位置往后移动,因为此时有可能出现这种情况:s=100,然后你此时窗口是[4,2,98],这里面还有更短的[2,98],所以此时起始位置应该往后移动去寻找这个窗口里的更短数组。

③有个小细节要注意,让起始位置往右移的时候是用if还是while呢?

因为有可能出现这种情况,你当前窗口为[2,2,2,2,2,98],如果是if,那你起始位置移动到第二个2就停下来了,然后接着跳出循环继续终止位置右移的循环,可是你起始位置只移动一位[2,2,2,2,98]这个并不是我们要的最短长度啊,所以应该是用while,让起始位置不断往后移直至找到最短长度。

④那找出各位置的最短数组后,有这么多数组,哪个才是最短的?

就像伪代码里的,你定义一个东西记录当前的最短长度,然后每次找到一个最短长度时就和那个最短长度比较,用min()留下最短的长度嘛。

滑动窗口的套路一般是这样的:

i=0;

for(j=0;j<=nums.size){

sum+=nums[j];  //sum是记录窗口里的和

while(sum>=s){

       sub=j-i-1;  //sub是记录当前窗口长度

       result=min(result,sub);  //就选出最短的那个长度

       sum=sum-nums[i];  //起始位置移动了窗口的和就减少了嘛

       i++;

   }

return result;

}

这里的时间复杂度是O(n)而不是O(n^2),不要以为for里面放一个while就以为是O(n^2),主要是看每个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是2*n也就是O(n),空间复杂度是O(1)

练习题:

①leetcode 209.长度最小的子数组(就是以这道题为例的)

②leetcode 904.水果成篮

这道题和上一道题有什么区别?区别在于上面那道题求的是最小滑动窗口,而本题求的是最大滑动窗口。最小滑动窗口和最大滑动窗口有什么不一样吗?

关键的区别在于,最小滑动窗口是在左边界右移的过程中更新结果(因为要找最短的情况嘛),是在左边界右移的循环内更新结果,为什么?因为你求的是最短长度嘛,左边界右移就在不断变短呀所以就要不断更新你的结果呀;  最大滑动窗口是在右边界右移的过程中更新结果(因为要找最长的情况嘛),是在右边界右移的循环内(左边界右移循环外)更新结果,为什么?因为你求的是最长长度嘛,右边界右移就在不断变长呀所以就要不断更新你的结果呀。

上道题是求和,所以定义个sum加和即可;这道题是限定只能有两种果类,所以可以考虑用哈希表,哈希表记录目前窗口出现的数及其出现的次数,也可以直接定义一个数组cnts来记录当前窗口出现的数及其出现的次数。

思路大致就是,定义left,right,做循环右指针往右移,统计每种数及其出现的次数,当出现哈希表.size()>2即需要进入循环让左指针往右移动,直至把其中某个数的出现次数变为0,即删除它,最终使得里面的数只有两种或者两种以下。(目前对哈希表都陌生了)

③leetcode 76.最小覆盖子串

这道题不是很透

http://【【LeetCode 每日一题】76. 最小覆盖子串 | 手写图解版思路 + 代码讲解-哔哩哔哩】 https://b23.tv/isdKQKf

这位答主的挺好,只是我还是有点不明白如果有D、E这种字母那咋弄的?此时hs[D]=1,可是ht[D]不存在呀,不存在就直接不理了吗因为没有满足if(hs[s[i]]<=ht[s[i]]),所以直接加入窗口就不用管了。反正长度可以直接i-j+1。

答主思路应该是这样: 定义两个哈希表,一个记录字符串t出现的字母以及其出现次数即ht,一个当前滑动窗口出现的字母及其出现次数即hs。然后定义一个cnt记录有效字符,注意什么是有效字符,s的下标为i的字符加入到hs中后,hs[s[i]]<=ht[s[i]] 才算有效字符,如ht里1个A,当前滑动窗口里就一个A那这个A就是有效字符,比如滑动窗口为[BAADC]而ht[]里就要一个A,所以B和第二个A就不是有效值了,到第一个A的时候就满足cnt=t.length了,左边界就可以右移找出当前窗口的最短长度了。

l=0,r=0,每次循环都有三步动作:

第一步是把当前数值加入到窗口中即hs[s[r]]++,如果加入后没有超过ht中该数值的数量即hs[s[r]]<=ht[s[r]],则说明该字符是一个有效字符,我们就要把cnt值+1,

第二步是因为我们已经在窗口中加入了一个新的字符,所以左侧可能存在冗余字符要删去,当hs[s[l]]>ht[s[l]],意思就是多余了,即做循环左边界往右移,如[ABAC]找AC,到ABA时,因为只要一个A,所以到第二个A时,左边界就往右移动,而B也是冗余的,所以再继续移动,所以是用循环while而不是if.

第三步是窗口已经移动完整,如果cnt值等于字符串t的长度,就说明窗口中已经覆盖了t中所有的字符,只要根据窗口长度(i-j+1)更新结果字符串就可以了。

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...