五月集训 (第06天) —— 滑动窗口

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五月集训 (第06天) —— 滑动窗口相关的知识,希望对你有一定的参考价值。

文章目录

前言

        此为《英雄算法联盟:算法集训》的内容,具体内容详见:知识星球:英雄算法联盟。加入星球后,即可享用星主 CSDN付费专栏 免费阅读 的权益。
        欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
        希望大家先自己思考,如果实在没有想法,再看下面的算法思路,如果有思路但是写不出来,可以参考朋友圈中其他人的代码,总有一款是适合你的,关注一下他,取其之长,补给之短。
        今天集训的内容是:滑动窗口
        前两题较为简单,后两题写起来稍微麻烦一点,如果暂时写不出来,可以先记录下,后续再来做。

一、练习题目

题目链接难度
1984. 学生分数的最小差值★☆☆☆☆
1876. 长度为三且各字符不同的子字符串★☆☆☆☆
1839. 所有元音按顺序排布的最长子字符串★★☆☆☆
1052. 爱生气的书店老板★★☆☆☆

二、算法思路

1、学生分数的最小差值

        (1)排序;
        (2)定义两个指针 ijj 不断往右移动的过程中,如果窗口长度超过了 k,则 i 向右移动一格;
        (3)当窗口长度等于 k 的时候,记录 nums[j] - nums[i] 的最小值。

2、长度为三且各字符不同的子字符串

        (1)设计两个指针 ij 分别指向字符串的两端;
        (2)右指针不断往右移,移动过程中如果发现右指针指向的字符出现了超过一次,则左指针右移,直到把这一次降下来;
        (3)如果窗口 [i, j] 长度大于 3 ,则左指针一直往右移,如果窗口等于 3 则计数器加一。

3、所有元音按顺序排布的最长子字符串

        (1)先把所有字符按照元音下标进行转换,转成数字后方便比较;
        (2)设定两个指针 ij
        (3)右指针不断自增的过程中,如果发现它转换后的数值和前一个数值的差等于0或者1则相安无事;否则,令 i=j,断开之前的串;
        (4)如果 i 对应的字符不是 ‘a’,则 i 继续自增;当 j 对应字符为 ‘u’ 的时候,更新长度最大值为 j-i+1

4、爱生气的书店老板

        (1)记录两个前缀和,一个表示不管生不生气的前缀和,一个表示考虑了生气的情况下的前缀和;
        (2)定义一个滑动窗口进行滑动操作,当窗口正好为 k 时,则进行判定;令考虑生气的情况下的人数为 x,当前窗口 [i, j] 的人数,考虑生气的情况系为 y,不考虑生气的情况下的人数为 z,结果就是 x - y + z,计算最大值。其中 yz 可以通过前缀和差分求得。

以上是关于五月集训 (第06天) —— 滑动窗口的主要内容,如果未能解决你的问题,请参考以下文章

七月集训(第06天) —— 滑动窗口

六月集训(第06天) —— 滑动窗口

五月集训(第18天) —— 树

五月集训(第14天) —— 栈

五月集训(第24天) —— 线段树

五月集训(第31天) —— 状态压缩