总结先放在前面:
滑动窗口法一般用于解决数组或字符串中,满足某类条件的最大或最小的连续区间。看到诸如连续XX的个数,最长子串的长度等等关键词,就可以考虑使用滑动窗口法
使用滑动窗口时的一些小技巧与注意点:
1.当下标进行变化时,要注意判断这个下标可能出现的越界情况,要了解下标变化之后到底产生了哪些影响。比如说NO.485. 最大连续 1 的个数
2.滑动窗口在取类似最大值的时候,例如NO.424. 替换后的最长重复字符,可以不必要每次都放大或者缩小窗口的体积,只需要一直保持最大窗口,如果有比这个窗口更大的的就更新最大窗口即可。
3.遇到字符串问题可以将其单独拆分成一个数组,用数组来存放每一个字符的出现次数,例如NO.424. 替换后的最长重复字符和NO.438. 找到字符串中所有字母异位词。或者用一个dict来存储,如NO.76. 最小覆盖子串
题目实战
1.NO.485. 最大连续 1 的个数
public class Solution {
public int FindMaxConsecutiveOnes(int[] nums) {
int left=0;
int right=0;
int max=0; //max用来存储最大连续1的个数
while(right<nums.Length){
while(nums[right]==0){
//先找到第一个不为0的
if(right==nums.Length-1){
return max;
}
right++;
}
//上述循环完成之后,此时nums[right]==1;
//此时left表示第一个不为0的连续子序列的开始
left=right;
while(nums[right]==1){
//如果right==1,那就一直往右移,直至right==0
if(right==nums.Length-1){
return Math.Max(max,right-left+1);
}
right++;
//这里结束之后,可能出现nums[right]==0的情况,需要对下面的max值进行修改
//max长度不能认为是right-left+1
}
max=Math.Max(max,right-left);
}
return max;
}
}
2.NO.424. 替换后的最长重复字符
一开始的想法是,right右移的同时判断是否与left相等,如果不等那么计数+1,直至大于k时可以得到从left开始的最长子串,然后对所有下标进行同样操作即可得到最长子串。不过这样做明显时间复杂度过高,于是这里是参考率官方题解的答案。
public class Solution {
public int CharacterReplacement(string s, int k) {
int[] num = new