滑动窗口法

算法介绍

滑动窗口法是在给定特定窗口大小的数组或字符串上执行要求的操作,该算法可以将部分问题中的嵌套循环转变为单循环,具有较小的时间复杂度O(n2)→O(n)。

算法框架

  • 滑动:窗口往某个方向移动的。
  • 窗口:窗口大小可以是固定的,也可以是变化的,可以不断扩容直到满足一定的条件,也可以不断缩小直到找到一个满足条件的最小窗口。

算法思路

  • 定义左右指针,初始化left = right = 0,把索引闭区间[left, right]称为一个窗口。
  • 不断增加right指针扩大窗口[left, right],直到窗口中的部分符合要求(寻找可行解)。
  • 停止增加right指针,然后不断增加left指针缩小窗口[left, right],直到窗口中的部分不再符合要求,于此同时需要不断更新结果(优化可行解,寻找最优解)。
  • 重复第2步和第3步,直到right指针到达字符串或者数组的尽头。

算法模板

# 窗口大小不固定
left, right = 0, 0
res = ??? # 根据实际需要设置
while right < n:
	window.add(right指针对应的元素)
	right += 1
	while window符合要求:
		检查是否需要更新res
		window.remove(left指针对应的元素)
		low += 1

return res	
# 窗口大小固定
right = 0
res = ??? # 根据实际需要设置
while right < n:
	window.add(right指针对应的元素)
	right += 1
	if right >= k: # 窗口达到最大值
		检查是否需要更新res
		window.remove(right-k对应的元素)

return res
# 巧用哈希表记录
left, right = 0, 0
res = ??? # 根据实际需要设置
hashTable = set()/defaultdict(int)
while right < n:
	更新hashTable # window.add(right对应的元素)
	检查是否需要更新res
	while window符合要求:
		更新hashTable # window.remove(left对应的元素)
		检查是否需要更新res
	right += 1

return res

算法应用

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        n = len(nums)
        res = n+1
        low, high = 0, 0
        count = 0
        while high < n:
            count += nums[high]
            while count >= target:
                res = min(res, high-low+1)
                count -= nums[low]
                low += 1
            high += 1
        return 0 if res == n+1 else res
class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        n = len(nums)
        sonNums = set()
        for high in range(n):
            if high > k:
                sonNums.remove(nums[high-k-1])
            if nums[high] in sonNums:
                return True
            sonNums.add(nums[high])        
        return False
class Solution:
    def findRepeatedDnaSequences(self, s: str) -> List[str]:
        n = len(s)
        if n <= 10:
            return []
        res = []
        hashTable = defaultdict(int)
        high = 9
        while high < n:
            ason = s[high-9:high+1]
            hashTable[ason] += 1
            if hashTable[ason] == 2:
                res.append(ason)
            high += 1
        return res

凉梦空间

欢迎你进入我的个人博客网站参观交流:https://www.liangmeng.xyz

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉丶梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值