【LeetCode基础算法】滑动窗口与双指针

定长滑动窗口

总结:入-更新-出。
入:下标为 i 的元素进入窗口,更新相关统计量。如果 i<k−1 则重复第一步。
更新:更新答案。一般是更新最大值/最小值。
出:下标为 i−k+1 的元素离开窗口,更新相关统计量。

# 1456. 定长子串中元音的最大数目
# 算是标准的定长滑动窗口模板了
class Solution:
    def maxVowels(self, s: str, k: int) -> int:
        ans = 0
        num_vowels = 0
        for right, c in enumerate(s):
            if c in 'aeiou': 
                num_vowels += 1  # 第一步:入
            
            if right < k-1:  # 窗口长度没达到k时,就重复第一步
                continue
            
            ans = max(ans, num_vowels)  # 更新最值
            if s[right-k+1] in 'aeiou':  # 第三步:出
                num_vowels -= 1
        return ans
    

2025-4-14
1456. 定长子串中元音的最大数目 1263
643. 子数组最大平均数 I
1343. 大小为 K 且平均值大于等于阈值的子数组数目 1317
2090. 半径为 k 的子数组平均值 1358

2025-4-15
2379. 得到 K 个黑块的最少涂色次数 1360
2841. 几乎唯一子数组的最大和 1546
2461. 长度为 K 子数组中的最大和 1553
1423. 可获得的最大点数 1574(逆向思维,计算长度为n-k的滑动窗口)

2025-4-16进阶
3439. 重新安排会议得到最多空余时间 I 1729
2134. 最少交换次数来组合所有的 1 II 1748
1297. 子串的最大出现次数 1748
2653. 滑动子数组的美丽值 1786

不定长滑动窗口

  1. 无重复字符的最长子串
  2. 每个字符最多出现两次的最长子字符串 1329
  3. 删掉一个元素以后全为 1 的最长子数组 1423
  4. 尽可能使字符串相等 1497

单序列双指针——相向

  1. 反转字符串
  2. 验证回文串
  3. 删除字符串两端相同字符后的最短长度 1502
  4. 给植物浇水 II 1507
  5. 有序数组的平方 做到 O(n)
  6. 找到 K 个最接近的元素
  7. 数组中的 K 个最强值 用双指针解决
  8. 两数之和 II - 输入有序数组

单序列双指针——同向

双序列双指针——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值