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

相关文章:

  • 个人AGI的理想界面是现在使用的界面?OpenAI总裁:界面将会消失,算力永远不够!我们正处在智能体时代的边缘
  • 免费开源显存测试工具memtest_vulkan:告别显卡故障的终极指南
  • GPT-6 vs Claude 5:2026 提示词工程进阶对比
  • MatAnyone终极指南:如何用AI实现专业级视频抠像
  • OpenRGB:一个软件搞定所有RGB设备,终结多软件冲突的终极解决方案
  • Axure中文界面全攻略:3步实现完美汉化,告别英文菜单困扰
  • 别再让 AI 瞎猜了!我用这套“拉片流”逼 Codex 剪出高质感视频
  • ANI-RSS刮削功能完全指南:3分钟打造专业级媒体库元数据
  • Android WebView安全防护实战:从XSS防御到JavaScript桥接安全
  • AI 身份验证与授权:为什么传统安全模式恰好是 AI 时代需要的
  • CentOS服务器上搭建Jenkins+maven+GitLab(一)——环境搭建
  • TikTok Scraper:无需登录,批量抓取 TikTok 数据的命令行工具
  • 3分钟解决Cursor试用限制:告别“You‘ve reached your trial request limit“错误
  • Python核心语法——面向对象基础
  • 终极指南:foo2zjs如何解决Linux下多品牌打印机兼容性难题
  • APKMirror终极指南:轻松获取安全安卓应用的完整教程 [特殊字符]
  • mRemoteNG终极指南:5步掌握开源远程连接管理神器
  • x64dbg插件xAnalyzer:逆向分析中的智能API识别与注释利器
  • C语言实现后量子加密Kyber算法:原理、性能与嵌入式集成实战
  • WhatsApp 多账号消息路由的设计与实现
  • Eigen 3.4 与 NumPy 1.24 坐标变换性能对比:旋转矩阵/四元数 10万次运算耗时分析
  • GameAssist:基于计算机视觉的AI游戏辅助系统技术架构与应用实践
  • 推荐七个冷门但超实用的神器!
  • 2026年AI Agent终于不吹了:82%企业开始真金白银地部署,但落地坑比你想的多
  • 移动芯片代号 SM8650/MT6985 解析:3分钟看懂厂商内部命名逻辑与定位
  • Linux服务器安全加固实战:从用户权限到入侵检测的完整配置指南
  • 从 FER2013 到 AffectNet:情绪识别数据集 10 年演进与模型训练策略调整
  • 用Upscayl解锁AI图像放大:让每一张照片都清晰如新
  • 告别乱码困扰:ConvertToUTF8插件让你的Sublime Text完美支持中文编码
  • 强化学习从入门到实践:MDP、DQN与PPO算法详解与代码实现