tag数组-刷题预备知识-5. 数组中的滑动窗口

一, 概述

简而言之,滑动窗口算法在一个特定大小的字符串或数组上进行操作,而不在整个字符串和数组上操作,这样就降低了问题的复杂度,从而也达到降低了循环的嵌套深度。其实这里就可以看出来滑动窗口主要应用在数组和字符串上, 当你遇到让求子串,子数组的问题时就要考虑一下使用双指针滑动窗口了.

二, 原理

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
之后重复上述过程,先移动 right,再移动 left…… 直到 right 指针到达字符串 S 的末端,算法结束。

如果你能够理解上述过程,恭喜,你已经完全掌握了滑动窗口算法思想。至于如何具体到问题,如何得出此题的答案,都是编程问题,等会提供一套模板,理解一下就会了。


  • 上述过程对于非固定大小的滑动窗口,可以简单地写出如下伪码框架:
//在s中寻找t的"最小覆盖子串", 找到后返回最小子串
string s.t;

int left,right = 0;
String res = s;

//定义一个窗口. 用来
while(right < s.size()){
    
    
	//向右遍历, 增大窗口 (寻找可行解)
	window.add(s[right]);
	right++;

	//检查窗口是否已经满足题目要求
	if(window 满足要求){
    
    
		//如果这次窗口的子串可以更短, 则更新res, 同时向后移动left, 把当前left指向的元素踢出窗口
		res = minLen(res, window);
		windows.remove(s[left]);
		left++;
	}
}

return res;
  • 对于固定窗口大小,可以总结如下:
// 固定窗口大小为 k
    string s;
    // 在 s 中寻找窗口大小为 k 时的所包含最大元音字母个数
    int  right = 0;while(right < s.size()) {
    
    
        window.add(s[right]);
        right++;
        // 如果符合要求,说明窗口构造完成,
        if (right>=k) {
    
    
            // 这是已经是一个窗口了,根据条件做一些事情
           // ... 可以计算窗口最大值等 
            // 最后不要忘记把 right -k 位置元素从窗口里面移除
        }
    }
    return res;
  • 参考文章:
    • labuladong
    • https://www.cnblogs.com/huansky/p/13488234.html

三, 栗子

3.1 lt. 209-长度最小的子数组

3.2 lt.76-最小覆盖子串

3.3 lt.239-滑动窗口最大值

3.4 lt.1456-定长子串中元音的最大数目

おすすめ

転載: blog.csdn.net/nmsLLCSDN/article/details/121492057