python-滑动窗口
学习文章:https://www.cnblogs.com/huansky/p/13488234.html
一、概念
整体移动一个窗口,在窗口中进行操作
二、思路
1、使用双指针,初始化left=right=0,把索引闭区间[left,right]成为一个窗口
2、不断增加right指针扩大窗口[left,right],直到窗口中的字符串符合要求
3、停止增加right,不断增加left指针缩小窗口[left,right],直到窗口中的字符串不再符合要求,同步每次增加left,都要更新一轮结果
4、重复2 3步,直到right到达字符串的尽头
三、伪代码
对于固定窗口大小
//固定窗口大小为k s='abcdefghi' //在s中寻找窗口大小为k时包含最大元音字母个数 right=0 while right<len(s): window.add(s[right]) right+=1 if right>=k: //这已经是一个窗口了,根据条件做一些事情 //可以计算窗口最大值等 //最后不要忘了将right-k位置元素从窗口里面移除 return res
固定窗口不需要用双指针,left=right-k
对于非固定大小的滑动窗口
s='abcdefghi' t='abc' //在s中寻找t的最小覆盖子串 left=0 right=0 res=s while right<len(s): window.add(s[right]) right+=1 while(window符合要求): //如果这个窗口的子串更短,则更新res res = minLen(res,window) window.remove(s[left]) left+=1 return res
四、模板
def findSubArry(nums): N=len(nums) #数组/字符串长度 left,right=0,0 #双指针,当前遍历区间为[left,right] 闭区间 sum=0 #用于统计 子数组/子区间是否有效 res=0 #保存最大的窗口 while right<N:#当右边的指针没有搜索到数组/字符串的结尾 sums+=nums[right] #增加当前右边指针的数字/字符串的求和/计数 while 区间[left,right]不符合题意: #此时需要一直移动左指针,直到找到一个符合题意的区间 sums-=nums[left]#移动左指针前需要减少left位置的计算值 left+=1#移动左指针 res=max(res,right-left+1) #更新结果 right+=1#移动右指针,探索新区间 return res