滑动窗口与双指针
灵茶山艾府
的题单。
一、定长滑动窗口
这类问题的框架可以分为三步
1 |
|
1456 定长子串中元音的最大数目
ts
1 |
|
643 子数组最大平均数Ⅰ
c++
输出结果有精度要求,所以返回值应该带上类型转换(double)
1343 大小为K且平均值大于等于阈值的子数组数目
ts
数组的reduce()
方法需要有返回值!!
2090 半径为k的子数组平均值
c++
考虑到测试用例,需要用long长整型声明变量。
ts
1 |
|
2379 得到K个黑块的最少涂色次数
ts
数组的reduce()
方法中不能使用continue
。
continue
语句只用用在for
、while
、do-while
这类循环语句中,而reduce
是一个高阶方法,不能用continue
。
2841 几乎唯一子数组的最大和
c++
由于需要统计是否出现重复数字,故使用map
类方法。
再次复习一下map
和unordered_map
的常用方法:
1 |
|
1423 可获得的最大点数
解题思路
正向思维 ⭐⭐⭐⭐
题目要求是要按顺序从正面或者反面拿牌使得取得的点数最大。由于牌面的点数是固定的,也就是说此时剩下的
n - k
张牌的点数和是最小的。此时,只要求点数和最小的连续
n - k
张牌即可。逆向思维
先计算按正序取牌的总点数,然后依次按倒序取牌,算得最小值。
1652 拆炸弹
解题思路
当k < 0
或k > 0
时,窗口都是随着i
的增大而向右移动的,两者的不同在于初始窗口的位置不同,所以可以把这两个情况放在一个循环中考虑。
3439 重新安排会议得到最多空余时间 Ⅰ
由于会议之间是不重叠的,所以有n
场会议就有n + 1
个茶歇时间(包括茶歇时间为0的情况)。调整k
次的话,就可以将k + 1
段茶歇时间并在一起,得到最长的休息时间。
可以将这个情景抽象为这个问题:有n + 1
个空余时间段,合并其中k + 1
个连续的空余时间段,得到的最大长度是夺少?(滑动窗口问题!!)
c++
题解中给出了lambda表达式写法, 故复习一下。
1 |
|
2134 最少交换次数来组合所有的1 Ⅱ
这一题中,1
的个数就是一个定长的滑动窗口,我们的任务是要得到当前环中1
的数量最多的部分。
c++
copy
函数的用法
1 |
|
1297 子串的最大出现次数
注意看,这题有个陷阱(后面的超时就是这个原因)!
如果有一个子串出现了n
次,那么这个子串的子串在字符串中出现的次数只多不少。
故,只要考虑要求的最小长度即可!
2653 滑动字数组的美丽值
显然,这题需要用滑动窗口来实现。
在做这题的过程中,使用容器的过程遇到了亿点点小挫折,且听我细细道来。
c++
map的使用
题目的需求是要得到第x小的数值,应该怎么得到呢?
我第一想法是用迭代器迭代x次,但是,窗口中的数值可能是会重复的!
最后debug后得到这样的代码:
1 |
|
set的使用
在set中放入重复的数字是没有响应的!重复的数字有且只能存入一次。
2269 找到一个数字的K美丽值
c++
将
int
类型变量转为string
1
to_string(num);
将
string
类型变量转为int
1
stoi();
换一个方向思考
题目是从最高位开始取
k
数判断是否美丽,不妨从最低k
位开始取。
1461 检查一个字符串是否包含所有长度为K的二进制子串
用unordered_set计算当前字符串的子串类型个数。