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

[Python]递归三部曲:线段树与滑动窗口最大值(19-21题全解析)

本文首发于 CSDN

配套代码仓库:Python_exercise_19

适用人群:有一定 Python 基础、想深入理解递归与数据结构的开发者


📌 写在前面

很多人在学习线段树时会遇到两个坎:一是看不懂递归,二是看得懂但写不出来

为了帮你跨过这两道坎,我设计了这组“递归三部曲”​ 练习题,围绕一个真实的 IoT 场景——鸿蒙网关乱序数据采集与实时告警​ 展开。

  • 第 20 题:让你亲手用手画递归的每一步(二分查找、区间分裂、线段树更新与查询),建立直觉。

  • 第 21 题:要求你把手工模拟的过程翻译成代码(静态查询→动态更新→顺序滑动窗口),实现“学以致用”。

  • 第 19 题:将线段树嵌入乱序数据流的真实工程场景,完成从理论到实践的飞跃。

三题环环相扣,核心思想只有一个——递归

如果你曾被递归折磨过,这组题就是最好的“康复训练”。


🧩 题目总览

编号

题目名称

领域

核心知识点

难度(华为OD)

难度(LeetCode)

角色

19

鸿蒙IoT网关数据采集与实时告警

数据结构·算法

动态开点线段树、区间最大值查询、乱序数据流、滑动窗口

⭐⭐⭐(中等偏上)

Medium

主任务

20

扩展练习(PyE19 补漏)

手工模拟·代码填空

二分查找手工模拟、区间分裂、线段树更新与查询手工模拟、边界条件处理、暴力法对比、代码填空

⭐⭐(简单~中等)

Easy-Medium

辅助理解

21

扩展练习(PyE19-2 补漏)

基础实现·顺序窗口

静态线段树查询、动态线段树更新、顺序滑动窗口最大值、复杂度对比

⭐⭐⭐(中等)

Easy-Medium

辅助理解

难度说明:参照华为 OD 机试和 LeetCode 体系,侧重数据结构与算法实现。


🎯 三大亮点:为什么这组题值得刷?

亮点一:递归思想贯穿始终,三步彻底搞懂

阶段

题目

做什么

收获

第一步:用手画

第20题

手工模拟二分查找、区间分裂、线段树更新与查询的每一步递归调用

建立“分治”的肌肉记忆,再也不怕递归

第二步:用代码写

第21题

将手工模拟转化为递归函数,实现动态开点线段树,并应用于顺序滑动窗口

理解递归如何自然地创建节点、回溯更新

第三步:用工程练

第19题

在线段树基础上处理乱序数据流,实现实时滑动窗口最大值

掌握递归在真实场景中的应用,应对面试高频题

亮点二:手工模拟 → 代码填空 → 独立实现,层层递进

  • 第20题​ 分为七阶,从“用手画”到“代码填空”,再到“独立实现”,确保你真正理解每一行代码背后的物理意义

  • 第21题​ 在20题的基础上,要求你从零写出线段树,并立即应用到顺序滑动窗口问题,实现“学以致用”。

  • 第19题​ 将线段树嵌入真实 IoT 场景,处理乱序数据、窗口滑动、重复时间戳、负值等边界,完成从理论到实践的飞跃。

亮点三:边界条件与性能优化并重

  • 第20题第四阶专门设置了边界条件手工计算(重复时间戳、负值、空窗口),防止你在代码中被动踩坑。

  • 第21题第四阶要求你进行复杂度对比,理解“为什么需要线段树”以及“什么时候暴力法更快”。

  • 第19题的评分要点明确指出:不仅要正确,还要高效(O(1) 均摊的单调队列解法可作为进阶挑战)。


👥 适合谁学?

  • 已经掌握基础 Python 语法,希望深入学习数据结构的开发者

  • 正在准备华为 OD 机试或大厂面试的求职者(线段树和滑动窗口是高频考点)

  • 对递归感到困惑,想通过“手工模拟+代码”彻底搞懂的学习者

  • 希望理解“从暴力到优化”思维过程的工程师


🚀 学习路线建议

  1. 先做第 20 题的手工模拟:拿出纸笔,严格按照题目要求画出每一步的 left、right、mid,画出区间分裂树,画出线段树更新后的节点值变化。这一步至关重要,它是后续所有代码的基础。

  2. 完成第 20 题的代码填空与暴力实现:填空能帮你检验对代码结构的记忆,暴力实现则让你亲身体会“为什么需要优化”。

  3. 进入第 21 题:先实现静态线段树查询(21-1),再扩展为动态更新(21-2),然后封装成顺序滑动窗口类(21-3),最后进行复杂度对比(21-4)。

  4. 挑战第 19 题:在 21-3 的基础上,增加乱序处理逻辑(未来数据不可见)。你可以先用暴力法验证正确性,再尝试用线段树优化。

  5. 进阶思考:线段树查询是 O(log N),但第 19 题其实可以用单调队列做到 O(1) 均摊。如果你有兴趣,可以尝试实现单调队列解法,并对比两种方案的优劣。


📁 文件结构

. ├── README.md # 本文档 ├── 19_harmony_iot_gateway.py # 鸿蒙IoT网关数据采集与实时告警(主任务) ├── 20_extend_exercise_pye19.py # 扩展练习(PyE19 补漏) │ ├── 第一阶:二分查找手工模拟 │ ├── 第二阶:区间分裂与区间树 │ ├── 第三阶:线段树更新与查询手工模拟 │ ├── 第四阶:边界条件手工计算 │ ├── 第五阶:暴力实现与复杂度对比 │ ├── 第六阶:代码填空 │ └── 第七阶:独立实现 └── 21_extend_exercise_pye19_2.py # 扩展练习(PyE19-2 补漏) ├── 21-1:静态线段树查询 ├── 21-2:动态线段树更新 ├── 21-3:顺序滑动窗口最大值 └── 21-4:复杂度对比与思考

💬 写在最后

这三道题是我精心设计的“递归三部曲”,希望能帮你彻底征服线段树和滑动窗口这两个高频考点。如果你在练习过程中有任何疑问,或者发现了更好的实现方式,欢迎在评论区留言交流!

觉得有用的话,点个赞 👍 再走吧~


📜 许可

本项目仅供学习交流使用,遵循 MIT License。

http://www.jsqmd.com/news/1405138/

相关文章:

  • 2026 延津中原文武学校招生简章|招生政策、学费、升学率、报名须知梳理 - Luckyone王
  • 科学研究的类型
  • 活动签到流程怎么优化?低成本私有化方案真的好用吗?
  • Unity接入IAP内购(Android,IOS)最新流程,第三篇 后台对购买结果的验证以及发货(Android)
  • 计算机毕业设计LangChain智能体工作流编排-图检索增强(GraphRAG)-桥梁规范与巡检报告智能问答系统-知识图谱(Neo4j)和大模型(LLM)
  • whisper.cpp 语音转文字完全指南:从命令行安装到高级转录技巧
  • GitHub Desktop汉化终极指南:三分钟让整个客户端界面变中文
  • 网盘直链下载助手实测:告别限速焦虑,8大网盘真实链接一步到位
  • 条件变量condition_variable
  • Mate Engine 桌面伴侣完整上手指南:从零开始打造会聊天、能跳舞的 VRM 虚拟伙伴
  • 一条命令搞定中兴光猫:zteOnu 工厂模式与永久 Telnet 完整上手指南
  • 广州换季清理家中闲置奢包,爱马仕香奈儿 LV 迪奥,奢二网线下门店帮你评估包包价值 - 每日小知识
  • 微信聊天记录永久保存方案:WeChatExporter开源导出工具完整上手指南(含避坑清单)
  • 一文搞懂位图转矢量:vectorizer 让 PNG/JPG 秒变可无限放大的 SVG
  • Nucleus Co-op:让PC单机游戏秒变本地分屏神器的开源利器
  • 资阳 - 用户198513
  • 3分钟搞定IDM免费激活:新手也能轻松上手的IDM激活脚本使用指南
  • LightGBM LambdaRank实战指南:从0到1训练你的第一个搜索排序模型
  • ncmppGui保姆级上手手册:把NCM加密音乐拖一下就解开,还免费
  • Android14 WMS-窗口添加流程(二)-Server端
  • 看门狗定时器(WDT)的实用技巧
  • Havennlon | 杂谈:AI补出来的,是表达完整性,不是认知完整性
  • 智能堆高机器人:窄通道、集群调度与无人化物流落地实践
  • 亲属关系公证双认证怎么办理?材料有哪些?科普
  • 2026 八月最新廊坊管道维修马桶疏通冻堵处置暗管测漏异物打捞商家汇总 - 启航优客
  • 2026年8月黄山外墙漏水维修靠谱渠道盘点,高层高空渗水修缮避坑指南 - 聪居到家
  • llms-txt-hub安全架构揭秘:CSRF防护、速率限制与Google Web Risk三重防线
  • Android14 WMS-IWindow介绍
  • 电脑搜索应用找不到如何解决
  • 2026年隐形拉链厂家怎么选?一份行业观察与选型指南 - 品牌报告