当前位置: 首页 > 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.jsqmd.com/news/924159/

相关文章:

  • 别再死磕EKF了!用ESKF搞定IMU+激光雷达融合,误差状态建模实战(附Python代码)
  • 胜菱智能技术实力多维度解析:精度刚性与速度指标对比 - 资讯纵览
  • FUXA实战:工业流程管道动画制作全流程指南
  • 2026手把手教你PDF转CSV!工具+在线方法全套教程
  • Windows 11优化神器:用Win11Debloat一键打造纯净高效系统
  • 如何永久保存微信聊天记录:WeChatMsg完整指南与实战技巧
  • 5分钟打造你的专属微信智能助手:Python微信机器人完全指南
  • ArcGIS Pro SDK 3.0 + VS2022 保姆级避坑指南:从破解文件AfCore.dll到AddIn图标显示,一次搞定
  • 如何5分钟完成黑苹果配置:OpCore Simplify图形化工具终极指南
  • 终极指南:如何使用baidu-wangpan-parse突破百度网盘限速
  • Translumo:终极实时屏幕翻译工具免费完整指南
  • 终极指南:如何在Windows上优雅使用BiliBili-UWP第三方客户端
  • Day06|用生产硬核笔记逆向解构《DDIA》:数据分区与高并发局部战争的路由抽象
  • 【信道估计】IEEE-802.11p标准的深度学习通道估计【含Matlab源码 15587期】
  • Altium Designer PCB设计全流程:从原理图到生产文件的实战指南
  • 如何高效构建现代化电子签名功能:Signature Pad专业开发指南
  • 搞定GC10-DET数据集预处理:手把手教你用Python脚本清理无标签图片和修正XML标签错误
  • 2026年京东云OpenClaw/Hermes Agent配置Token Plan集成保姆级
  • 3分钟掌握跨平台直播聚合的智能方案:Simple Live技术深度解析
  • 2026年最好用的在线PDF压缩工具推荐指南:手把手教你3分钟搞定文件压缩
  • 长沙黄金回收 2026 全攻略|5.31今日金价 + 正规门店榜单 + 避坑指南 - 资讯纵览
  • Django 模型查询中的数据库连接池配置指南
  • 基于RP2040 Pico的125Msps任意波形发生器:DMA与PIO硬件加速实战
  • KMS智能激活工具:如何5分钟内完成Windows和Office永久激活
  • 服务网格Istio实战与微服务治理
  • 基于Arduino Leonardo的辅助游戏控制器:为行动受限玩家打造定制化交互方案
  • 2026年5月铝合金门窗/断桥铝门窗/系统门窗/提升窗/智能门窗厂家推荐:认准东莞市欧尚雅门窗有限公司 - 海棠依旧大
  • 2026终极测评:16款降AIGC软件测评,闭眼入这款就对了! - 降AI小能手
  • Solon Server 启动模式深度解析:从 0.3MB 内核到 10+ Server 插件
  • Gemini入门必踩的5个致命误区:90%新手第3步就失败,附Google认证调试手册