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

滑动窗口题解:窗口移动靠条件,不靠感觉

滑动窗口题解:窗口移动靠条件,不靠感觉

一、滑动窗口不是双指针套皮

滑动窗口常用于子数组、子串、连续区间问题。很多人看到连续就上左右指针,但写着写着就乱:什么时候右移,什么时候左移,窗口内维护什么,答案何时更新,全靠感觉。真正的滑动窗口依赖明确条件。

窗口移动不是模板背诵,而是维护一个可验证的不变量。

二、先定义窗口语义

flowchart TD A[右指针扩张] --> B[加入新元素] B --> C{窗口是否合法} C -->|否| D[左指针收缩] C -->|是| E[更新答案] D --> C

窗口通常表示[left, right][left, right)。区间开闭要先定清楚,不然后面边界会乱。

sliding_window_steps: define_window: true expand_right: true shrink_until_valid: true update_answer_at_correct_time: true

每一步都要知道自己在维护什么条件。

三、例子:最长无重复子串

def length_of_longest_substring(s: str) -> int: seen = {} left = 0 ans = 0 for right, ch in enumerate(s): if ch in seen and seen[ch] >= left: left = seen[ch] + 1 seen[ch] = right ans = max(ans, right - left + 1) return ans

这里窗口不变量是:s[left:right+1]内没有重复字符。右指针加入字符后,如果重复位置在窗口内,就把 left 移到重复字符后一位。

注意seen[ch] >= left。如果重复字符已经在窗口外,就不该移动 left。这是很多边界错误的来源。

四、不同题型更新答案位置不同

求最长合法窗口,通常在窗口合法后更新答案;求最短满足条件窗口,通常在满足条件时收缩并更新答案;求恰好 K 个条件,有时要转化成“最多 K 减最多 K-1”。

def at_most_k(nums, k): left = 0 ans = 0 count = {} for right, x in enumerate(nums): count[x] = count.get(x, 0) + 1 while len(count) > k: y = nums[left] count[y] -= 1 if count[y] == 0: del count[y] left += 1 ans += right - left + 1 return ans

这个函数统计最多 K 种不同元素的子数组数量。每次窗口合法后,新增的合法子数组数量是right - left + 1

滑动窗口的难点不是代码长,而是答案含义。更新 max、min、count 的位置不同,背模板会很容易错。

最后,做题时可以先写暴力解,明确“枚举哪个区间”,再把重复枚举变成窗口维护。这样比直接套模板更稳。

五、总结

滑动窗口题解要先定义窗口语义和合法条件,再决定扩张、收缩和答案更新位置。

窗口移动靠条件,不靠感觉。只要不变量站住,代码就不会一改边界就崩。

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

相关文章:

  • 别再让 AI 瞎猜了!我用这套“拉片流”逼 Codex 剪出高质感视频
  • Axure中文界面全攻略:3步实现完美汉化,告别英文菜单困扰
  • Android WebView安全防护实战:从XSS防御到JavaScript桥接安全
  • CentOS服务器上搭建Jenkins+maven+GitLab(一)——环境搭建
  • TikTok Scraper:无需登录,批量抓取 TikTok 数据的命令行工具
  • WhatsApp 多账号消息路由的设计与实现
  • 用Upscayl解锁AI图像放大:让每一张照片都清晰如新
  • NetApp FAS存储加密实战:从硬件SED到KMIP密钥管理的企业级方案
  • 告别乱码困扰:ConvertToUTF8插件让你的Sublime Text完美支持中文编码
  • SEO 的十个核心优化要点,落实之后稳步提升自然流量
  • 2026年健康趋势:探寻最专业的苦荞早餐片制造商
  • 新手也能上手!2026年首选推荐的专业AI论文平台
  • Python 面向对象编程
  • SQL 复购分析:时间窗口写错,结论会完全变样
  • 微信小程序 WXML 数据绑定与 JS 模块化:从考试题到项目实践的 2 个核心模式
  • Kindle Comic Converter:重新定义电子墨水屏漫画阅读的颠覆性黑科技
  • 本地搭建SSL加密MQTT服务器:从原理到实践
  • whisper.cpp语音识别实战:从嵌入式到云端的全栈部署指南
  • BatteryML完整指南:5分钟掌握电池寿命预测的终极开源工具
  • ClickHouse 聚合表:快之前,先把指标粒度定死
  • Tensor 生命周期分析:复用内存之前,先证明不会重叠
  • 我做了一个集合各大 AI 图片模型提示词的网站
  • YubiKey硬件密钥实现Linux全盘加密:挑战响应与LUKS集成实战
  • 40克AI眼镜实现端侧实时同传的技术突破
  • openeuler/riscv-kernel最佳实践:高效内核开发的7个技巧
  • 从 Harness Engineering 到 Trellis:AI 编程助手的工程化落地实践
  • WPS表格Python脚本:读取与筛选数据实战
  • 我劝你立刻开始搞Agent,别等“时机成熟“
  • MongoDB的应用
  • 域渗透实战:从信息收集到域控攻防的完整攻击路径解析