当前位置: 首页 > news >正文

Python滑动窗口算法

"""
滑动窗口 — 高效处理连续子数组/子串的利器
固定窗口滑移求和;可变窗口用左右指针维护合法区间
"""


def fixed_window_sum(arr: list, k: int) -> list:
"""所有长度为 k 的子数组和,增量更新 O(n)"""
if len(arr) < k: return []
cur = sum(arr[:k])
res = [cur]
for i in range(k, len(arr)):
cur += arr[i] - arr[i - k]
res.append(cur)
return res


def length_of_longest_substring(s: str) -> int:
"""无重复字符的最长子串 (LeetCode 3)"""
used = {}
left = mx = 0
for r, ch in enumerate(s):
if ch in used and used[ch] >= left:
left = used[ch] + 1
used[ch] = r
mx = max(mx, r - left + 1)
return mx


def min_window(s: str, t: str) -> str:
"""最小覆盖子串 (LeetCode 76)"""
from collections import Counter
need = Counter(t)
miss = len(t)
left = 0
best = (float('inf'), 0)
for r, ch in enumerate(s):
if need[ch] > 0: miss -= 1
need[ch] -= 1
while miss == 0:
if r - left + 1 < best[0]:
best = (r - left + 1, left)
lc = s[left]
need[lc] += 1
if need[lc] > 0: miss += 1
left += 1
return s[best[1]:best[1] + best[0]] if best[0] != float('inf') else ""


def min_subarray_len(target: int, nums: list) -> int:
"""和 >= target 的最短子数组 (LeetCode 209)"""
left = cur = 0
best = float('inf')
for r, v in enumerate(nums):
cur += v
while cur >= target:
best = min(best, r - left + 1)
cur -= nums[left]; left += 1
return best if best != float('inf') else 0


def check_inclusion(s1: str, s2: str) -> bool:
"""s2 是否包含 s1 的排列 (LeetCode 567)"""
if len(s1) > len(s2): return False
from collections import Counter
need = Counter(s1); miss = len(s1)
for r, ch in enumerate(s2):
if need[ch] > 0: miss -= 1
need[ch] -= 1
l = r - len(s1)
if l >= 0:
need[s2[l]] += 1
if need[s2[l]] > 0: miss += 1
if miss == 0: return True
return False


def demo():
print(f"固定窗口 k=3 和: {fixed_window_sum([1,2,3,4,5,6], 3)}")
print(f"无重复最长子串 'abcabcbb': {length_of_longest_substring('abcabcbb')}")
print(f"最小覆盖: {min_window('ADOBECODEBANC', 'ABC')}")
print(f"和>=7 最短: {min_subarray_len(7, [2,3,1,2,4,3])}")
print(f"排列 'ab' in 'eidbaooo': {check_inclusion('ab', 'eidbaooo')}")


if __name__ == "__main__":
demo()

http://www.gsyq.cn/news/1435484.html

相关文章:

  • FUXA实战:工业流程管道动画制作全流程指南
  • 2026手把手教你PDF转CSV!工具+在线方法全套教程
  • Windows 11优化神器:用Win11Debloat一键打造纯净高效系统
  • 终极指南:如何在Windows上优雅使用BiliBili-UWP第三方客户端
  • Altium Designer PCB设计全流程:从原理图到生产文件的实战指南
  • 如何高效构建现代化电子签名功能:Signature Pad专业开发指南
  • 基于RP2040 Pico的125Msps任意波形发生器:DMA与PIO硬件加速实战
  • 服务网格Istio实战与微服务治理
  • 从光敏电阻到物联网:手把手教你制作智能酒精消毒提醒器
  • 如何用.NET Windows Desktop Runtime轻松部署Windows桌面应用?终极解决方案来了!
  • 2026终极测评:16款降AIGC软件测评,闭眼入这款就对了! - 降AI小能手
  • Solon Server 启动模式深度解析:从 0.3MB 内核到 10+ Server 插件
  • MASA模组全家桶汉化包:让中文玩家轻松掌握顶级Minecraft工具
  • 在Ubuntu 20.04上为CARLA 0.9.14手动打上鱼眼相机补丁(附编译避坑指南)
  • 2026 年郑州GEO代运营公司盘点:五家AI服务商深度解析 - 资讯纵览
  • 如何用.NET Windows Desktop Runtime彻底告别部署噩梦?完整实战指南
  • 如何快速部署开源自动化工具:5个实用技巧让你轻松玩转鸣潮游戏
  • 2026上海金桥能长租的高端酒店公寓|浦东商务租住首选榜单 - 资讯纵览
  • 2026年栀子花香水推荐:从大牌到小众高性价比选购指南 - 资讯纵览
  • 【企业级隐私防护紧急指南】:Gemini API调用新规生效前,你漏掉了这4个GDPR致命漏洞
  • 论文写完怕重复率爆表?这个AI免费查重神器,90%的同学还不知道!
  • 如何快速解锁游戏窗口限制:终极窗口编辑器完整指南
  • 2026 广州工厂搬家公司口碑排行榜 权威实测推荐 - 从来都是英雄出少年
  • 3步解密:让QQ音乐加密文件重获自由
  • 3步轻松下载国家智慧教育平台电子课本:tchMaterial-parser高效解析工具完整指南
  • 广州专业搬工厂公司 TOP5 推荐 高效安全有保障(2026 最新) - 从来都是英雄出少年
  • 广州厂房搬家费用大揭秘 隐形消费全曝光 避坑指南 - 从来都是英雄出少年
  • 南京50+热盘售楼处电话一键直通(2026年5月最新版) - 资讯纵览
  • 终极黑苹果配置指南:OpCore-Simplify如何让OpenCore EFI创建变得简单快速
  • 如何永久保存微信聊天记录?WeChatMsg完整导出指南