在练习算法题的时候,对于新手来说不是很好,但是其实里面有好多技巧,介绍滑动窗口。窗口一样有边界的情况,比如窗口的宽是取决两边。
对于滑动窗口的应用场景,比如题库中出现关键字,满足某某条件计算结果(出现次数,同时包含):最长 最短 子串 子数组 子序列。
思路(寻找最长)
1、核心:左右双指针(left right)在起始点,right向右逐位循环移动,每次移动过程中
2、
如果:窗口内元素满足条件,right向右扩大窗口,更新最优结果
如果:窗口内元素不满足条件,left向右缩小窗口
3、直到right到达结尾
思路(寻找最短)
1、核心:左右双指针(left right)在起始点,right向右逐位循环移动,每次移动过程中
2、
如果:窗口内元素满足条件,left向右缩小窗口,更新最优结果
如果:窗口内元素不满足条件,right向右扩大窗口
3、直到right到达结尾
模板
// 最长
int left = 0;
int right = 0;
int result = 0;
int optimalResult = 0;
while(右指针没有到达结尾) {
窗口扩大,添加right对应的元素,更新当前result
while(result 不满足题目所说的条件) {
更新最优的结果 optimalResult
窗口缩小,移除left对应的元素,left右移
}
right++;
}
return optimalResult;
// 最短
int left = 0;
int right = 0;
int result = 0;
int optimalResult = 0;
while(右指针没有到达结尾) {
窗口扩大,添加right对应的元素,更新当前result
while(result 满足题目所说的条件) {
更新最优的结果 optimalResult
窗口缩小,移除left对应的元素,left右移
}
right++;
}
return optimalResult;