力扣1004 最大连续1的个数III 2024考试的最大困难度(滑动窗口)

在这里插入图片描述

     本道题就是一个滑动窗口题,但是什么时候扩大窗口,什么时候收缩窗口?
     根据题目意思就是,如果这个窗口里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的最大长度作比较,取出它俩中的最大长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值