滑动窗口的基本模式
🐼对于滑动窗口是我接触的第二个较为系统的算法。
💻从算法原理来讲:我觉得,它倒像是,不同思想的双指针算法,其实之前的双指针主要运用的还是元素的性质,和一些位置关系之类的,但是滑动窗口维护的是一段区间,总的来说思想其实就是改版的队列只不过他没有把元素单独摘出来进行存储而已,用两个指针维护队列,分别区分队头队尾,然后在出队,检查,入队的时候对答案进行更新。
那下面我们就用具体的题目进行阐述把
本文由爱吃苹果的清梦,友情提供🐻
题目描述
题目解析
通过这道题我们可以一窥滑动窗口的一点门路,,从题目中我们可以看出来这道题也是对于连续序列的枚举,那么我们就需要两个边界对于这一个个序列进行枚举,但是因为特殊的规律我们可以通过指针的跳转,来简化枚举,来进行计算。
思路一:暴力枚举
看到这个题我们不难发现,如果我们对每一个序列的起点进行枚举,然后使用计数器,对于其中的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;
}
};
后记
这只是简单的滑动窗口应用,对于滑动窗口的具体应用还要看具体场景,但是主要的应用场景在字符串中应用广泛。
🐨 如果感兴趣的话,不妨支持一下博主,您的支持将是我不懈动力😏