
滑动窗口
椎名ひる
研究生,转码中
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
76、覆盖最小子串
right遍历时将tmap中对应字符-1,直到其为0,表明该字符个数已经足够,那么cnt--。开始移动left,试图寻找更小的窗口,同时更新tmap、cnt,如果还是满足cnt==0那么继续更新ansleft和ansright。right遍历,最后如果一个满足的窗口都没找到,那么left为初始值,此时return ""即可,否则return s中相应的字符串。本题中最后需要return最小的字符串,因此需要获得左右窗口端点,用ansleft ansright保存。当cnt==0时,说明所有字符个数都够了。原创 2025-07-06 16:58:59 · 153 阅读 · 0 评论 -
2302、统计得分小于K的子数组数目
当前窗口为[lrft,right],但是score对应的窗口为[left,right-1],一共为right-left个数,首先score/=right-left,然后加上right的数,再乘现在的长度right-left+1,完成scoer的更新。更新完成后,score小于k时更新ans即可,对[left,right],那么[left+1,right],[left+2,right]...[right,right]都满足,一共为right-left+1个。原创 2025-07-06 15:32:48 · 177 阅读 · 0 评论 -
1658. 将 x 减到 0 的最小操作数
维护窗口[left,right],窗口左右就是弹出的数,那么只需要保证窗口内的数大小等于target=(所有数总和-x)。最后还需要判断ans是否小于0,小于0说明无论如何都不能满足,return -1即可。否则说明存在满足的情况,ans保存的是窗口内数组的长度,那么就return len-ans。right遍历数组,sum存储窗口内的总和,每次遍历sum加入right对应的值,当sum大于target时弹出左边数直到小于等于,等于时更新ans,小于则继续遍历right。原创 2025-07-06 15:05:37 · 219 阅读 · 0 评论 -
2962、统计最大元素出现至少K次的子数组
维护窗口[left,right],当MAXcount==k时,从左边开始弹出直到弹出一个MAX,此时窗口内MAXcount=k-1。可能的子数组为[0,right],[1,right]...[left-1,right]共left个。在MAXcount没有第一次到达k时,left始终为0,不影响ans。if判断语句可以简化成一行。原创 2025-07-06 10:37:38 · 214 阅读 · 0 评论 -
1004、最大连续1的个数 III
统计窗口内zero的数量,如果超过k则左指针右移直到满足zero<k,每个right满足条件后更新ans。原创 2025-07-05 16:38:48 · 134 阅读 · 0 评论 -
2730、找到最长的半重复子字符穿
窗口为[left,right],ans为窗口长度,same为子串长度,窗口满足题设条件,即只含一个连续重复字符,则更新ans,否则从左边开始一直弹出,直到满足条件。same记录窗口内出现的重复字符串个数。same<2时满足条件。原创 2025-07-04 19:35:47 · 255 阅读 · 0 评论 -
2958、最多K个重复元素的最长子数组
在上一题的基础上,修改一下即可。上一题是哈希表的value与1相比,本题改成与k相比即可。原创 2025-07-03 19:36:36 · 207 阅读 · 0 评论 -
713、乘积小于K的子数组
k==0和k==1单独设置,k==0或者k==1时不存在严格小于k的子数组,return 0。遍历右端点,更新m,如果满足m<k则ans++,否则一直弹出左边窗口的数并且m除去弹出的数。left和right两个指针指示窗口边界,m为窗口内所有数乘积。原创 2025-07-03 19:27:39 · 206 阅读 · 0 评论 -
3、无重复字符的最长子串
遍历右指针,每次将右指针的字符对应的哈希表value++。然后判断该key的value是否大于1,如果大于1意味着有重复字符了,将左指针右移弹出一个字符,该字符的value--,重复这个步骤直到right指向的字符的value为1,即是该right边界的最大可能字符串。然后更新ans,ans=max(ans,right-left+1)空间复杂度O(n),如果字符串s的字符限定范围,比如本题中只可以是数字符号空格字母,也可以视作是O(1),哈希表长度为常数。两个指针left、right来表示窗口前后边界。原创 2025-07-03 19:10:04 · 164 阅读 · 0 评论 -
209、长度最小的子数组
ans为窗口内元素个数,ans的初始化需要满足ans>n,以方便判断是否全部元素加起来都不满足target。[left,right]窗口内元素个数计算为:right-left+1。窗口内元素和sum>=target时,left++,推出左侧一个元素;sum<target时,right++,加入右侧一个元素。也即相当于用for遍历右指针位置,右指针最后到len-1位置并且sum<target时候结束。滑动窗口,左右指针指向窗口两端,窗口为[left,right],left=right时窗口只包含一个元素。原创 2025-07-03 12:16:18 · 139 阅读 · 0 评论