CHAPTER 01 · 基础建模

框架思维与复杂度

先学会描述问题、估算代价,再决定使用什么数据结构和算法。

3 个知识小节4 道分层练习3–4 天 建议周期
展开本章目录
  1. 学习之前
  2. 1. 输入规模与复杂度预算
  3. 2. 用集合与映射建立索引
  4. 3. 解题闭环:实现、验证、复盘
  5. 延伸阅读
  6. 分层练习
  7. 我的笔记
00

BEFORE LEARNING

先理解为什么学

这一章不追求记住更多算法,而是建立一套稳定的解题顺序:读约束、写暴力、找重复、选择数据结构、证明复杂度。后面的每个专题都会重复使用这套流程。

开始前应具备

  • 能读懂数组、字符串和循环
  • 知道函数参数与返回值
  • 可以独立完成简单枚举

完成本章后

  • 读懂时间与空间复杂度
  • 建立先暴力、再优化的解题顺序
  • 熟悉哈希表的空间换时间
01

CORE LESSONS

知识讲义

01

LESSON

输入规模与复杂度预算

什么时候想到它?

题目给出 n 的范围,或暴力枚举看起来可能超时时,先估算允许的操作数量。

复杂度是输入增长时工作量的变化趋势。先列出最直接的枚举,再检查循环层数、递归分支和额外存储,才能知道优化目标究竟是减少一次遍历,还是消除一层枚举。

推导步骤

  1. 写出最直接且不会漏解的方案
  2. 标出重复计算和无效搜索
  3. 根据 n 判断需要降到哪一级复杂度
  4. 最后再验证空间开销和边界
思维模板 / 伪代码
约束 n → 允许的复杂度
暴力解 → 找重复工作
选择索引或单调性 → 优化
用样例与边界验证
02

LESSON

用集合与映射建立索引

什么时候想到它?

题目反复询问“是否出现过”“某个值对应什么位置”“能否找到互补元素”时,考虑哈希结构。

集合只回答是否存在,映射保存键到信息的对应关系。真正的关键不是使用 Map,而是定义好键:原值、排序后的字符串、计数编码或前缀和都可能成为索引。

推导步骤

  1. 明确查询问题是什么
  2. 决定键代表哪个等价类别
  3. 决定值保存位置、次数还是对象
  4. 边遍历边查询,注意查询与写入顺序
思维模板 / 伪代码
for item in input:
  key = encode(item)
  if key in index: use(index[key])
  index[key] = information
03

LESSON

解题闭环:实现、验证、复盘

什么时候想到它?

任何题都适用,尤其是“看懂题解但下次仍不会”的情况。

完成提交不是学习终点。一个完整闭环需要能够复述状态、解释每一步为何不漏解,并记录失败原因。只有能迁移到相似题,才算形成了算法模式。

推导步骤

  1. 独立思考并写出失败点
  2. 只看一级提示后再次尝试
  3. 通过后口述正确性与复杂度
  4. 隔天不看代码重写核心部分
思维模板 / 伪代码
题目特征:___
核心状态:___
不变量:___
失败原因:___
下次识别信号:___
02

READING

延伸阅读

先读完本站讲义并尝试练习;遇到推导不清的地方,再回到原始教程深入阅读。

03

PRACTICE LADDER

按作用分层练习

题量由知识点决定,不再固定为 5 道。先完成“入门”和“模板”,再做变式与综合;挑战题可以留到复习阶段。

入门认识结构模板独立复现变式迁移条件综合组合技巧挑战延后突破
01

输入规模与复杂度预算

0 道 · 依次完成

02

用集合与映射建立索引

3 道 · 依次完成

LC 217入门简单

存在重复元素

Contains Duplicate

为什么选:只需回答是否出现过,适合区分 Set 与 Map。

集合建议 15 分钟
打开 LeetCode ↗
LC 1模板简单

两数之和

Two Sum

为什么选:训练“查询互补值后再写入”的标准哈希流程。

哈希表建议 25 分钟
打开 LeetCode ↗
LC 242变式简单

有效的字母异位词

Valid Anagram

为什么选:把索引从元素位置迁移为字符计数。

计数建议 20 分钟
打开 LeetCode ↗
03

解题闭环:实现、验证、复盘

1 道 · 依次完成

LC 49综合中等

字母异位词分组

Group Anagrams

为什么选:需要自行设计能代表同一组异位词的键。

哈希映射建议 35 分钟
打开 LeetCode ↗
04

PERSONAL NOTEBOOK

我的学习笔记

我如何识别这个模式?今天卡在哪里?下次需要先检查什么?

笔记保存在当前浏览器