【无标题】

滑动窗口是一种常见的算法优化技巧,常用于数组和链表问题。它通过维护一个大小固定的窗口,在数组或链表中移动,解决如找最短子数组、最多不同水果数量和最小覆盖子串等问题。文章通过三个具体题目实例,详细解释了滑动窗口的工作原理,包括窗口内元素的意义、窗口移动方式,并提供了相应的解题代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

滑动窗口

滑动窗口通常用于数组或链表题目中,作为暴力解法的优化,可以理解为双指针的一种。

  1. 窗口内的元素代表着什么?
  2. 如何移动窗口的起始位置,终止位置?
    经典题目:

3.1 长度最小的子数组(209)

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        n = len(nums)
        i = 0
        sum = 0
        res = float("inf")
        for j in range(n):
            sum +=nums[j]
            while sum >= target:
                res = min(res, j-i+1)
                sum -= nums[i]
                i += 1
        return 0 if res == float("inf") else res

3.2 水果成篮(904)

class Solution:
    def totalFruit(self, fruits: List[int]) -> int:
        n = len(fruits)
        hashT = defaultdict(int)
        res = 0
        i = 0
        for j in range(n):
            hashT[fruits[j]] += 1
            while sum(k>=1 for k in hashT.values())>2:
                res = max(res, j-i)
                hashT[fruits[i]] -= 1
                if hashT[fruits[i]] == 0:
                    hashT.pop(fruits[i])
                i+=1
        res = max(res, j-i+1)
        return res

3.3 最小覆盖子串

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        m, n = len(s), len(t)
        hashT = defaultdict(int)
        hashT2 = {}
        
        for i in range(n):
            hashT[t[i]] += 1
            
        i=0
        for j in range(m):
            if s[j] in hashT:
                hashT[s[j]] -= 1
                while sum(k<=0 for k in hashT.values() ) == len(hashT):
                    if s[i] in hashT:
                        hashT[s[i]] += 1
                    hashT2[j-i+1] = s[i:j+1]
                    i+=1
        
        return hashT2[min(hashT2.keys())] if hashT2 else ""
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值