五月集训 (第06天) —— 滑动窗口
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五月集训 (第06天) —— 滑动窗口相关的知识,希望对你有一定的参考价值。
文章目录
前言
此为《英雄算法联盟:算法集训》的内容,具体内容详见:知识星球:英雄算法联盟。加入星球后,即可享用星主 CSDN付费专栏 免费阅读 的权益。
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
希望大家先自己思考,如果实在没有想法,再看下面的算法思路,如果有思路但是写不出来,可以参考朋友圈中其他人的代码,总有一款是适合你的,关注一下他,取其之长,补给之短。
今天集训的内容是:滑动窗口
前两题较为简单,后两题写起来稍微麻烦一点,如果暂时写不出来,可以先记录下,后续再来做。
一、练习题目
题目链接 | 难度 |
---|---|
1984. 学生分数的最小差值 | ★☆☆☆☆ |
1876. 长度为三且各字符不同的子字符串 | ★☆☆☆☆ |
1839. 所有元音按顺序排布的最长子字符串 | ★★☆☆☆ |
1052. 爱生气的书店老板 | ★★☆☆☆ |
二、算法思路
1、学生分数的最小差值
(1)排序;
(2)定义两个指针 i 和 j,j 不断往右移动的过程中,如果窗口长度超过了 k,则 i 向右移动一格;
(3)当窗口长度等于 k 的时候,记录 nums[j] - nums[i] 的最小值。
2、长度为三且各字符不同的子字符串
(1)设计两个指针 i 和 j 分别指向字符串的两端;
(2)右指针不断往右移,移动过程中如果发现右指针指向的字符出现了超过一次,则左指针右移,直到把这一次降下来;
(3)如果窗口 [i, j] 长度大于 3 ,则左指针一直往右移,如果窗口等于 3 则计数器加一。
3、所有元音按顺序排布的最长子字符串
(1)先把所有字符按照元音下标进行转换,转成数字后方便比较;
(2)设定两个指针 i 和 j;
(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,计算最大值。其中 y 和 z 可以通过前缀和差分求得。
以上是关于五月集训 (第06天) —— 滑动窗口的主要内容,如果未能解决你的问题,请参考以下文章