🚪 算法入门篇(零基础版)
算法是什么 · 复杂度是什么 · 数据结构地图 · 刷题路线与方法
1. "算法"和"数据结构"到底是什么?
🍳 类比——做菜:
数据结构 = 厨房里的工具和容器:数组是盘子(摆一排)、链表是串串(穿起来)、栈是叠盘子(后放先拿)、队列是排队(先来先走)
算法 = 菜谱步骤:怎么用这些容器高效完成任务(怎么排序、怎么找东西、怎么走迷宫)
数据结构 = 厨房里的工具和容器:数组是盘子(摆一排)、链表是串串(穿起来)、栈是叠盘子(后放先拿)、队列是排队(先来先走)
算法 = 菜谱步骤:怎么用这些容器高效完成任务(怎么排序、怎么找东西、怎么走迷宫)
简单说:
- 数据结构:数据怎么组织(存的方式决定快慢)
- 算法:数据怎么处理(排序、查找、计算)
- 两者不分家:选对数据结构,算法自然快(用 HashMap 找东西比数组快 100 倍)
为什么面试考算法:考察逻辑思维、代码功底、对性能的理解——不是考"背题"。
🎯 记住
- 数据结构 = 存法;算法 = 解法;存法决定解法的效率
- Java 的 ArrayList/HashMap 都是现成数据结构——你每天都在用,算法题是让你"会造 + 会选"
2. 什么是"时间复杂度"?(面试第一问)
时间复杂度(大 O):数据量 n 变大时,程序运行时间增长的速度。不是算具体秒数,是看"量级趋势"。
感受复杂度:n = 100 万
O(1) // HashMap 查一次:瞬间(不管数据多大都是 1 步)
O(log n) // 二分查找:约 20 步(100 万折半 20 次)
O(n) // 遍历一次:100 万步(毫秒级)
O(n log n) // 快排:约 2000 万步(OK)
O(n²) // 双重循环:1 万亿步(十几分钟起步 💥)
O(2ⁿ) // 指数级:宇宙毁灭也算不完 ☠️
判断方法:数循环——一层循环 O(n),两层嵌套 O(n²),循环里砍一半 O(log n)。
🎯 记住
- O(n²) 的代码在百万数据下必挂——所以算法题要"会优化"
- 面试讲答案必讲复杂度:"这题暴力是 O(n²),我用哈希优化到 O(n)"——就这一句就赢了
- 空间复杂度同理:额外开了多大内存(O(1)=不额外开,O(n)=开了一个数组)
3. 数据结构地图:什么时候用什么?(收藏)
| 数据结构 | 特点 | 什么时候用 |
|---|---|---|
| 数组 | 按下标 O(1) 取 | 固定大小、按下标访问 |
| 链表 | 插入删除快(改指针) | 频繁增删、LRU 缓存 |
| 栈 | 后进先出 | 括号匹配、撤销操作 |
| 队列 | 先进先出 | 排队、BFS 层序遍历 |
| 哈希表(HashMap) | 查找 O(1) | 查找/去重/计数——最常用 |
| 堆(PriorityQueue) | 随时取最值 O(log n) | TopK、中位数 |
| 二叉树/BST | 有序、O(log n) 查找 | 排序、范围查找(TreeMap) |
| 图 | 节点 + 关系 | 社交关系、地图、依赖 |
🎯 最高频组合
- "找元素" → 先想哈希表(O(1))——解决 70% 的"暴力超时"问题
- "取最值" → 堆;"有序" → 排序 + 二分;"相邻关系" → 图 + BFS/DFS
4. 零基础刷题路线(别从难的开始!)
- 阶段 0(1~2 周):先会写代码(beginner 模块)→ 数组、字符串、简单循环题
- 阶段 1(2~3 周):哈希表 + 双指针——两数之和、滑动窗口、无重复最长子串
- 阶段 2(2 周):链表 + 栈队列——反转链表、有效括号、LRU
- 阶段 3(3 周):二叉树——遍历、最大深度、层序、最近公共祖先
- 阶段 4(3 周):排序 + 二分 + 动态规划入门
- 持续:每日 1~2 题,用"高频 100 题"清单反复刷