本道题就是一个滑动窗口题,但是什么时候扩大窗口,什么时候收缩窗口?
根据题目意思就是,如果这个窗口里0的数目少于k的数目,滑动窗口就可以扩大,然后等到滑动窗口中0的数目等于k的时候,这个时候就可以来更新res,来找长度最大的,然后当滑动窗口中的0的数目大于k的时候,就要开始缩小窗口,直到窗口里面的0的个数小于等于k的时候,才停止缩小窗口
class Solution {
public int longestOnes(int[] nums, int k) {
int left=0;
int right=0;
int res=0;
int nums0=0;
while(right<nums.length) {
if(nums[right]==0) {//如果是0的话,计数器增加
nums0++;
}
//窗口内0的个数大于k,left左移,一直移到nums0<=k的时候
while(nums0>k) {
if(nums[left]==0) {
nums0--;
}
left++;
}
res=Math.max(res,right-left+1);
right++;
}
return res;
}
}
在做这个题的时候就相当于分两个类型,不要一次想着求出答案,要不就感觉很混乱,因为不知道当前的字符到底是用F替换还是T。
本道题和上一道题是类似的,就是先对T进行滑动窗口,然后再对F进行滑动窗口,最后找到两个中的最大值。
class Solution {
public int maxConsecutiveAnswers(String answerKey, int k) {
return Math.max(len(answerKey, 'T', k), len(answerKey, 'F', k));
}
public int len(String anString,char c,int k) {
int left=0,cnt=0,res=0;
//cnt用来记录需要被替换的字符个数
for(int right=0;right<anString.length();right++) {
if(anString.charAt(right)==c)
cnt++;
while(cnt>k) {
if(anString.charAt(left)==c) {
cnt--;
}
left++;
}
res=Math.max(right-left+1, res);
}
return res;
}
}
首先先来看看传T的情况,如果传的是T,表示这个滑动窗口维护的是F的最长长度,首先进到for循环,如果当前的字符是T,则T的计数器增加,然后如果窗口中T的计数器大于k,就得缩小窗口,删除窗口中的T,然后更新长度。传F和传T是一样的。
最后将得到的F的最大长度和T的最大长度作比较,取出它俩中的最大长度。