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

  • Post author:
  • Post category:其他


在这里插入图片描述

本道题就是一个滑动窗口题,但是什么时候扩大窗口,什么时候收缩窗口?

根据题目意思就是,如果这个窗口里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的最大长度作比较,取出它俩中的最大长度。



版权声明:本文为weixin_51656756原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。