滑动窗口与双指针
滑动窗口
定长滑窗
例子:
套路:
窗口右端点在下标i时,窗口长度为k,此时窗口左端点下标为i-k+1
三步:
入-更新-出
- 入:进入窗口,下标i的元素进入窗口,更新相关统计量。如果窗口左端点i-k+1<0,即i<k-1,则说明窗口还未形成,重复第一步,保证窗口的形成。
- 更新:更新答案。一般都是更新最大值/最小值。
- 出:下标为i-k+1的元素离开窗口,更新相关统计量,为下一个循环做准备。
java
class Solution {
public int maxVowels(String s, int k) {
char[] sArr = s.toCharArray();
int ans = 0;
int vowel = 0;
for (int i = 0; i < sArr.length; i++) {
// 1. 入
if (isVowel(sArr[i])) {
// 更新相关统计量
vowel++;
}
// 窗口大小不足k的情况,保证窗口的形成
if (i < k - 1) {
continue;
}
// 2. 更新答案
ans = Integer.max(ans, vowel);
// 3. 离开窗口,左端点离开
char out = sArr[i - k + 1];
if (isVowel(out)) {
// 更新相关统计量
vowel--;
}
}
return ans;
}
private boolean isVowel(char current) {
if (current == 'a' || current == 'e' || current == 'i' || current == 'o' || current == 'u') {
return true;
}
return false;
}
}