力扣刷题笔记 数组篇03——滑动窗口

总结先放在前面:

滑动窗口法一般用于解决数组或字符串中,满足某类条件的最大或最小的连续区间。看到诸如连续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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值