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

 

posted @ 2021-02-19 16:23  hkk  阅读(1010)  评论(0)    收藏  举报