7 月高频算法题回顾:滑动窗口、双指针与单调栈的精进
7 月高频算法题回顾滑动窗口、双指针与单调栈的精进一、深度引言与场景痛点刷了三遍还写不对的窗口滑动窗口、双指针、单调栈——这三个技巧被称作线型数据结构三板斧。7 月的高频题超过 40% 的题能用这三者之一优雅解决。但优雅的背后是无数次的边界崩溃。最典型的场景写一个滑动窗口求最长无重复子串写得顺手但遇到最多包含 K 个不同字符的最长子串时同样的思路却怎么调都通不过。问题出在哪里出在窗口收缩条件和状态更新时机这两个细节上。7 月我把这三个技巧的高频题重新做了一遍每道题都画了状态转移图。这篇文章记录精进过程中的关键发现。二、底层机制与原理深度剖析三种技巧的本质统一滑动窗口的本质是维护一个满足条件的区间在该区间上做增量计算。这里有两个关键操作窗口扩张时更新状态窗口收缩时恢复状态。最容易出错的是更新和收缩的先后顺序。以 LeetCode 3无重复字符的最长子串为例遇到重复字符时先收缩窗口还是先更新最大长度答案是先收缩把重复字符移出再更新长度。因为长度计算的依据是当前窗口的边界如果窗口内还有重复字符此时计算的长度是无效的。双指针的核心是用两个游标在有序性上做文章。对撞指针依赖数组有序快慢指针依赖步长差异分离指针则分别处理不同的维度。这三者的共同前提是指针移动方向和数据的有序性之间存在可证明的单调关系。单调栈的底层逻辑是维持一个单调序列这个序列的每个元素代表一个候选答案。当新元素破坏单调性时被弹出的元素就找到了下一个更大/更小的位置关系。这个弹出即是找到答案的特性是单调栈之所以能 O(n) 解决区间极值问题的根本原因。三、生产级代码实现与最佳实践三个模板的工程化封装 高频算法模板库 —— 滑动窗口、双指针、单调栈 设计目标每一个模板都是可直接复用的工程代码而非竞赛风格的极简实现 每个模板包含核心逻辑 边界处理 时空复杂度注释 from collections import Counter, deque from typing import List # 模板一可变滑动窗口 def longest_substring_with_k_distinct(s: str, k: int) - int: LeetCode 340最多包含 K 个不同字符的最长子串 时间复杂度O(n)每个字符最多被加入和移除各一次 空间复杂度O(k)哈希表仅存储 k 种字符的计数 设计要点 1. 窗口用左右指针 [left, right) 表示这是最常见的约定 2. 计数用 Counter它是 dict 的子类在 O(1) 内完成增减 3. 收缩条件在扩张之后判断保证窗口状态始终有效 if k 0 or not s: return 0 # 边界无字符或 K0 时直接返回 counter: Counter[str] Counter() # 当前窗口内的字符计数 left 0 max_len 0 for right, ch in enumerate(s): counter[ch] 1 # 扩张窗口总是先将字符纳入窗口 # 收缩条件不同字符数超过 K # 注意这里是 while 而非 if因为可能需要多次收缩 while len(counter) k: left_char s[left] counter[left_char] - 1 if counter[left_char] 0: # 计数归零时必须删除 key否则 len(counter) 不会减少 del counter[left_char] left 1 # 此时窗口内不同字符数 ≤ K更新最大长度 # 更新时机必须在收缩之后保证窗口有效 max_len max(max_len, right - left 1) return max_len # 模板二快慢指针环形检测 def find_duplicate(nums: List[int]) - int: LeetCode 287寻找重复数Floyd 判圈算法 时间复杂度O(n) 空间复杂度O(1)不使用额外空间 核心思想将数组视为链表值代表 next 指针指向的下标 如果有重复数链表中必然存在环 slow 每次走一步fast 每次走两步相遇后在环内从头同步走 # 第一阶段检测环的存在 slow fast nums[0] while True: slow nums[slow] # 慢指针走一步 fast nums[nums[fast]] # 快指针走两步 if slow fast: break # 相遇确认有环 # 第二阶段找环的入口即重复数 slow nums[0] # 慢指针回到起点 while slow ! fast: slow nums[slow] fast nums[fast] # 此时 slow/ fast 指向环的入口即重复数 return slow # 模板三单调递减栈下一个更大元素 def daily_temperatures(temperatures: List[int]) - List[int]: LeetCode 739每日温度 时间复杂度O(n)每个元素最多入栈出栈各一次 空间复杂度O(n)栈最多存储 n 个元素 核心技巧栈中存储下标而非值通过下标可以同时获取值和位置差 这是单调栈模板最重要的设计选择 n len(temperatures) result [0] * n # 结果数组默认 0 表示未找到 stack: List[int] [] # 单调递减栈存下标 for i, temp in enumerate(temperatures): # 新元素大于栈顶对应的值 → 弹出栈顶并记录结果 while stack and temp temperatures[stack[-1]]: prev_idx stack.pop() # 弹出较小的元素 result[prev_idx] i - prev_idx # 天数差 # 无论如何都将当前下标入栈 stack.append(i) # 栈中剩余的元素找不到比它更大的温度result 默认为 0 return result这三个模板覆盖了 7 月高频题中的核心模式。模板不是用来背的而是用来理解为什么这样设计的。理解了为什么单调栈存下标而非值你才能应对循环数组求下一个更大元素这种变形题。四、边界分析与架构权衡什么时候用哪种技巧一个常见误区是强行套模板。不是所有求最长都能用滑动窗口不是所有成对比较都能用双指针。选择的依据是两个关键判断第一个判断问题是否具有单调性。滑动窗口要求窗口扩张/收缩的条件是单调的——你不能时而向左时而向右地调整。单调栈要求元素间的比较关系是确定的。接雨水能用单调栈是因为柱子高度的比较结果是确定的。第二个判断复杂度目标是否可接受。如果暴力解已经是 O(n)引入复杂技巧没有意义。例如判断数组是否有重复元素直接用 set 遍历即可不需要上双指针。此外需要警惕模板的缝合怪陷阱。有些题需要滑动窗口 单调队列的组合如滑动窗口最大值此时两个模板各自独立的部分需要合并。合并的关键在于用单调队列维护窗口内的单调性用滑动窗口控制窗口范围。分开理解每个组件再组合而不是指望存在一个万能模板。五、总结7 月对这三个技巧的精进核心收获不在代码而在两个认知上的升级第一边界条件不是需要死记的例外情况而是算法本质的一部分。滑动窗口的收缩条件设计本质上是窗口有效性这个数学定义在代码中的等价表达。第二模板的价值在于提炼共性而不是替代思考。当你画出了状态转移图写出了不变式代码其实已经是水到渠成的事了。8 月继续用这个思路去攻区间 DP 和状态压缩 DP。不再追求做题量追求的是每个技巧都能从原理讲到实现从实现讲到变形。

相关新闻

Jellium Desktop界面语言教程:快速设置多语言界面的完整指南

Jellium Desktop界面语言教程:快速设置多语言界面的完整指南

Jellium Desktop界面语言教程:快速设置多语言界面的完整指南 【免费下载链接】jellium-desktop An unofficial desktop client for Jellyfin 项目地址: https://gitcode.com/GitHub_Trending/je/jellium-desktop Jellium Desktop是一款功能强大的Jellyfin非官…

2026/7/27 14:52:05阅读更多 →
pgwire高级特性:深入探索PostgreSQL协议的高级功能与扩展

pgwire高级特性:深入探索PostgreSQL协议的高级功能与扩展

pgwire高级特性:深入探索PostgreSQL协议的高级功能与扩展 【免费下载链接】pgwire PostgreSQL wire protocol implemented as a rust library. 项目地址: https://gitcode.com/gh_mirrors/pg/pgwire pgwire是一个用Rust实现的PostgreSQL wire协议库&#xff…

2026/7/27 14:50:05阅读更多 →
如何高效查询手机号码归属地:开源Go库实战指南

如何高效查询手机号码归属地:开源Go库实战指南

如何高效查询手机号码归属地:开源Go库实战指南 【免费下载链接】phonedata 手机号码归属地信息库、手机号归属地查询 phone.dat 最后更新:2023年02月 项目地址: https://gitcode.com/gh_mirrors/ph/phonedata 在当今数字时代,手机号码…

2026/7/27 14:50:05阅读更多 →
短剧特殊音效配音实测:打电话、回音AI能不能配出来

短剧特殊音效配音实测:打电话、回音AI能不能配出来

先说结论:能配,但关键不是把所有声音都合成为普通对白。内心OS、电话声、回响声是短剧译制中最容易被跳过或抹平的三类场景。按功能验收口径检查,智马翻译支持三类特殊音色复刻,也提供“使用原音频”和新增片段两条补救路径&#…

2026/7/27 16:18:21阅读更多 →
大批量短剧配音情绪还原实测:效率和质量能不能双达标

大批量短剧配音情绪还原实测:效率和质量能不能双达标

先说结论:可以双达标,但前提不是简单地把单条音频生成速度乘以集数,而是同时验证“固定技术水位”和“批量并发架构”。前者决定哭戏、争吵、内心独白等片段会不会随任务增多而失真,后者决定排队、失败重试与文件管理会不会拖慢交…

2026/7/27 16:18:21阅读更多 →
frePPLe开源供应链计划系统:企业数字化转型的终极解决方案

frePPLe开源供应链计划系统:企业数字化转型的终极解决方案

frePPLe开源供应链计划系统:企业数字化转型的终极解决方案 【免费下载链接】frepple frePPLe - open source supply chain planning 项目地址: https://gitcode.com/gh_mirrors/fr/frepple 在当今快速变化的市场环境中,供应链管理已成为企业竞争力…

2026/7/27 16:18:21阅读更多 →
TMS320VC5505 DSP低功耗架构解析与嵌入式信号处理实战

TMS320VC5505 DSP低功耗架构解析与嵌入式信号处理实战

1. 项目概述:深入解析TMS320VC5505低功耗定点DSP在嵌入式信号处理领域,选对一颗核心处理器往往决定了整个项目的成败。尤其是在对功耗和实时性都极为苛刻的便携式、电池供电设备中,我们需要的不仅是一颗“能算”的芯片,更是一颗“…

2026/7/27 16:18:21阅读更多 →
深入解析ARM7TDMI编程模型与异常处理:从TMS470R1x实战看嵌入式系统基石

深入解析ARM7TDMI编程模型与异常处理:从TMS470R1x实战看嵌入式系统基石

1. 项目概述与核心价值 在嵌入式开发的底层世界里,处理器架构手册往往是工程师最亲密也最令人敬畏的伙伴。它不像应用层API那样友好,却定义了系统一切行为的基石。今天,我想和你深入聊聊TI的TMS470R1x系列微控制器,特别是它的编程…

2026/7/27 16:18:21阅读更多 →
计算机毕业设计之基于springboot的华清远见学员培训系统

计算机毕业设计之基于springboot的华清远见学员培训系统

二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

2026/7/27 16:16:21阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/27 1:14:34阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/27 1:14:52阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/27 1:14:56阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:24阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:24阅读更多 →
2007-2023年各市区县生态文明建设示范区DID

2007-2023年各市区县生态文明建设示范区DID

数据简介 自改革开放以来,我国依赖高投入、高资源消耗和高污染等传统发展模式实现了经济短期内的快速增长, 然而这也导致了严重的生态环境危机。因此,国家有力于推动企业高质量经济发展,协同生态保护的方针,从而从201…

2026/7/27 0:00:24阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →