news 2026/9/18 6:31:30

双指针/滑动窗口/前缀和:Maths, CS AI Compendium数组与哈希题型清单

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
双指针/滑动窗口/前缀和:Maths, CS AI Compendium数组与哈希题型清单

双指针/滑动窗口/前缀和:Maths, CS & AI Compendium数组与哈希题型清单

【免费下载链接】maths-cs-ai-compendiumBecome a cracked AI/ML researcher/engineer with this unconventional textbook covering maths, computing, and ML with intuition.项目地址: https://gitcode.com/GitHub_Trending/mat/maths-cs-ai-compendium

在开源教材Maths, CS & AI Compendium的第 14 章《数据结构与算法》中,数组与哈希 模块把面试中最值钱的四种题型——双指针、滑动窗口、前缀和、哈希表查找——按"简单 → 中等 → 困难"逐级拆解。本文提炼出完整的题型清单、适用信号和易错点,适合算法面试备考的新手对照练习。

📌 项目简介:一本"直觉优先"的面试备考教材

Maths, CS & AI Compendium 是一本开源、以直觉为先的教科书,从向量、矩阵、微积分一路讲到机器学习、计算机视觉与 ML 系统设计,共 20 章。它的算法章节有一个鲜明主张:教模式,而不是背题解——让你面对没见过的题也能"剥掉背景、认出模式"。

为什么这四种题型值得优先掌握?原文给出了一个直接的判断:

如果你深刻理解数组和哈希表,就能解决大约40% 的编程面试题目

这两个结构提供了算法最需要的两件事:数组提供 O(1) 的下标访问,哈希表提供 O(1) 的按键查找。foundations.md 中进一步解释:全世界的题目再多,核心模式只有 15–20 个,面试官会不断"换皮"出题,认模式比背答案可靠得多。

🧭 题型总览:四大模式快速对照表

模式适用信号(什么时候想到它)代表题型优化效果
哈希表查找需要反复问"见过这个值吗?"两数之和O(n²) → O(n)
双指针数组有序 / 需要比较两两配对三数之和O(n³) → O(n²)
滑动窗口满足约束的子串/子数组,且约束单调最小覆盖子串O(n²) → O(n)
前缀和多次范围求和 / 特定和的子数组计数和为 K 的子数组O(n²) → O(n)

判断口诀(来自 foundations.md):

  • 输入有序 → 优先想双指针
  • 子数组/子串 + 单调约束 → 优先想滑动窗口
  • 重复的范围求和查询 → 优先想前缀和
  • "补数、配对、出现过几次" → 优先想哈希表

1️⃣ 双指针题型清单:两个下标相向而行的 O(n) 解法

双指针用两个下标以相反方向或不同速度扫过数组,前提是数组有序(或排序后不丢失关键信息)。完整讲解见 01. arrays and hashing.md #L166。

难度题型核心思路常见坑
简单有效回文左右指针向中间夹逼,跳过非字母数字字符内层循环漏写left < right会越界
中等三数之和排序后"固定一个 + 双指针找两数",总复杂度 O(n²)去重是最大难点,固定元素和指针结果都要跳过重复值
困难接雨水双指针 + 两侧 running max,每次处理较矮的一侧>=更新最大值,注意 off-by-one

要点记忆:

  • 三数之和(#L200-L239):i > 0 and nums[i] == nums[i-1]: continue这一行去重逻辑是题眼,漏掉就会输出重复三元组。
  • 接雨水(#L242-L273):关键洞察是"矮的一侧水深只取决于它自己一侧的 max",由此做到 O(1) 额外空间,优于预计算左右最大值数组的写法。

2️⃣ 滑动窗口题型清单:先扩张、再收缩的单调区间

滑动窗口维护一个连续区间,right扩张、left收缩,适合"最长/最短满足某条件的子串/子数组"问题——前提是约束是单调的(加元素只会让条件更难或更容易满足,不会两者兼有)。模板与讲解见 #L277-L304。

难度题型核心思路常见坑
简单买卖股票的最佳时机退化的窗口:记录历史最低价,每天算一次利润左指针只在出现新低时前移,别想复杂了
中等无重复字符的最长子串哈希表记录字符最近下标,遇重复直接"跳"必须检查char_index[char] >= left,防止用窗口外的旧位置收缩
困难最小覆盖子串扩张到覆盖t的全部字符,再收缩求最小have计数器让校验 O(1);比较要用==而不是>=

要点记忆:

  • 无重复子串(#L326-L350):用哈希表"跳跃"比用集合逐个删字符更快,这是窗口 + 哈希的经典组合拳。
  • 最小覆盖子串(#L352-L401):have计数器是决定性优化,没有它每步都要比较整个计数表。
  • 窗口长度公式right - left + 1是最常见的 off-by-one 来源,原文建议"画一个两元素的例子"来核对。

3️⃣ 前缀和题型清单:把 O(n) 区间查询压到 O(1)

前缀和数组满足prefix[i] = sum(arr[0:i]),建一次 O(n),之后任意区间和sum(arr[l:r]) = prefix[r] - prefix[l]一步取出。讲解见 #L405-L419。

难度题型核心思路常见坑
简单区间求和查询O(n) 预处理后,每次查询 O(1)前缀数组长度是n + 1,下标从 0 对齐
中等和为 K 的子数组区间和 = 两个前缀和之差 → 用哈希表统计"出现过多少次prefix - k"必须初始化{0: 1},否则漏掉从下标 0 开始的子数组
困难除自身以外数组的乘积左趟存前缀积、右趟乘后缀积,全程不做除法数组含 0 时除法解法直接失效,前缀/后缀法天然免疫

要点记忆:

  • 和为 K 的子数组(#L429-L452)是"前缀和 + 哈希表"双模式叠加的样板题,也是前缀和模式里最常考的中等难度题。
  • 除自身以外乘积(#L454-L482)展示了如何用输出数组本身暂存前缀积,做到 O(1) 额外空间。

4️⃣ 哈希表查找题型清单:O(1) 查找替代 O(n) 扫描

原文建议:只要问题在反复问"见过这个值吗"或"这个键对应什么",就伸手拿哈希表。完整讲解见 #L76-L77。

难度题型核心思路常见坑
简单两数之和遍历一遍,查"补数"是否在表中,查完再插入先查后插,否则会和自己配对
中等字母异位词分组排序后字符串(或 26 维字符计数元组)作为"规范形式"键Python 列表不可哈希,必须转 tuple
困难最长连续序列全体入集合,只从"序列起点"(num - 1不在集合)开始数没有起点判断会退化成 O(n²)

要点记忆:

  • 两数之和(#L80-L100):单次遍历 + O(1) 查找,总 O(n);"先检查、后插入"的顺序是这道题唯一的坑。
  • 最长连续序列(#L136-L162):内层 while 对所有迭代合计最多跑 n 次,所以整体仍是 O(n)——这是面试中常被追问的复杂度论证点。

⚠️ 高频陷阱速查表

原文 Common Pitfalls Summary 总结了这几类题最容易翻车的七个地方:

陷阱症状修正
窗口长度 off-by-oneright - leftright - left + 1混淆画一个两元素的小例子验证
前缀和漏初始化漏掉从下标 0 开始的子数组始终初始化{0: 1}
哈希表插入顺序错两数之和元素自己和自己配对先查后插
未处理重复三数之和输出重复三元组跳过连续相等值
循环里拼接字符串Python 中s += c是 O(n²)先 append 列表再 join
大数组求和溢出C++/Java 中 int 溢出long或检查边界

🗺️ 练习路线:按顺序过一遍清单

模块末尾附了一份按模式分组的 Take-Home 练习清单(#L500-L526),建议按以下路线学习:

  1. 第 0 步:先读 00. foundations.md,把 Big O 增长速率表和"模式 vs 记忆"的思路过一遍;
  2. 第 1 步:哈希表查找组(两数之和 → 异位词分组 → 最长连续序列);
  3. 第 2 步:双指针组(回文 → 三数之和 → 接雨水),重点练去重;
  4. 第 3 步:滑动窗口组(股票 → 无重复子串 → 最小覆盖子串),先背模板再刷题;
  5. 第 4 步:前缀和组(区间求和 → 和为 K → 除自身外乘积),体会"前缀和 + 哈希表"的组合威力。

每做完一道,对照上文的"常见坑"列自查一遍,比盲目多刷三道更有效。

📚 相关资料

  • 核心源码:01. arrays and hashing.md(数组/哈希原理 + 四大模式 + 易错点)
  • 前置基础:00. foundations.md(Big O、递归、回溯、动态规划)
  • 延伸学习:05. sorting and search.md(排序与二分,双指针题的前置技能)
  • 项目总览:README.md(20 章完整目录与学习方法)

【免费下载链接】maths-cs-ai-compendiumBecome a cracked AI/ML researcher/engineer with this unconventional textbook covering maths, computing, and ML with intuition.项目地址: https://gitcode.com/GitHub_Trending/mat/maths-cs-ai-compendium

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 6:29:56

肌电图临床判读四层逻辑与神经肌肉诊断决策链

简介&#xff1a;本资源是一份面向神经科医生、康复医师、物理治疗师及医学生等临床与科研人员的《肌电图操作常规》专业指导文档&#xff0c;系统解决肌电图&#xff08;EMG&#xff09;与神经电生理检查标准化实施难题。全文共六章&#xff0c;覆盖检查前申请规范、针极/单纤…

作者头像 李华
网站建设 2026/9/18 6:28:46

HFSM分层有限状态机实战:事件流、优先级与历史恢复

HFSM分层有限状态机这个坑&#xff0c;我是在做第三人称动作游戏的角色控制器时踩进去的。七种角色状态&#xff1a;待机、跑步、攻击、翻滚、受击、死亡、跳跃&#xff0c;用扁平FSM硬写&#xff0c;switch-case堆到五百行之后&#xff0c;加一个新状态就要回改三个旧状态。后…

作者头像 李华
网站建设 2026/9/18 6:28:41

DeFi利率计算的形式化验证与安全防护实践

1. 项目背景与核心价值去年某知名DeFi平台因利率计算漏洞导致上亿美元资产面临风险的事件&#xff0c;让整个行业意识到传统审计手段的局限性。这个项目正是针对DeFi领域最关键的利率计算模块&#xff0c;构建了一套形式化验证的自动化防护体系。我参与过多个DeFi项目的安全审计…

作者头像 李华
网站建设 2026/9/18 6:26:55

齿轮故障诊断与时变啮合刚度计算MATLAB实战

1. 齿轮故障与啮合刚度&#xff1a;工程师必须掌握的关键问题作为一名在齿轮传动领域摸爬滚打多年的工程师&#xff0c;我深知啮合刚度这个参数对整个传动系统的重要性。就像人体的关节一样&#xff0c;齿轮啮合刚度的变化直接影响着整个机械系统的"健康状况"。而点蚀…

作者头像 李华
网站建设 2026/9/18 6:26:07

微信聊天记录导出WeChatMsg使用指南:从0到1跑通完整流程

微信聊天记录导出WeChatMsg使用指南&#xff1a;从0到1跑通完整流程 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeC…

作者头像 李华