滑动窗口的基本模式

滑动窗口的基本模式

🐼对于滑动窗口是我接触的第二个较为系统的算法。
💻从算法原理来讲:我觉得,它倒像是,不同思想的双指针算法,其实之前的双指针主要运用的还是元素的性质,和一些位置关系之类的,但是滑动窗口维护的是一段区间,总的来说思想其实就是改版的队列只不过他没有把元素单独摘出来进行存储而已,用两个指针维护队列,分别区分队头队尾,然后在出队,检查,入队的时候对答案进行更新。
那下面我们就用具体的题目进行阐述把
image.png

本文由爱吃苹果的清梦,友情提供🐻

题目描述

image.png

题目解析

通过这道题我们可以一窥滑动窗口的一点门路,,从题目中我们可以看出来这道题也是对于连续序列的枚举,那么我们就需要两个边界对于这一个个序列进行枚举,但是因为特殊的规律我们可以通过指针的跳转,来简化枚举,来进行计算。
思路一:暴力枚举
看到这个题我们不难发现,如果我们对每一个序列的起点进行枚举,然后使用计数器,对于其中的0进行计数,只要我们筛选出来,只有k个0的1的序列不就是符合题意的么
思路二: 滑动窗口
通过上边的暴力解决方法我们总结出来这样一个规律,只要我们固定起点的某个序列0超标了我们就需要换起点知道换到,0的数量减少位置就可以,不断地更新答案就可以了。
模拟图演示

最优算法实现

class Solution {

public:

    int longestOnes(vector<int>& nums, int k) {

        int hh = 0;

        int tt = 0;

        int z_cnt = 0;

        int res = 0;

        while( tt < nums.size())

        {

            while(tt < nums.size() && z_cnt <= k)

            {

                if(!nums[tt])z_cnt++;

                if(z_cnt > k) break;

                res =  max(res,tt - hh + 1);

                tt++;

  

            }

            while(hh <= tt && z_cnt > k)

            {

                if(!nums[hh])z_cnt--;

                hh++;

  

            }

            tt++;

        }

        return res;

    }

};

后记

这只是简单的滑动窗口应用,对于滑动窗口的具体应用还要看具体场景,但是主要的应用场景在字符串中应用广泛。
在这里插入图片描述

🐨 如果感兴趣的话,不妨支持一下博主,您的支持将是我不懈动力😏

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值