数据结构与算法
前端面试必备算法知识,按专题分类,包含完整代码、示例和边界条件
📚 目录索引
| 专题 | 文件 | 题目数 | 重点内容 |
|---|---|---|---|
| 链表 | 01-linked-list.md | 6 题 | 反转链表、K个一组翻转、环检测 |
| 二叉树 | 02-binary-tree.md | 6 题 | 遍历、重构、最大路径和、LCA |
| 数组/字符串 | 03-array-string.md | 8 题 | 两数之和、滑动窗口、二分查找 |
| 动态规划 | 04-dynamic-programming.md | 6 题 | 背包问题、LIS、LCS |
| 图算法 | 05-graph.md | 4 题 | DFS/BFS、拓扑排序、最短路径 |
| 排序算法 | 06-sorting.md | 6 种 | 快排、归并、堆排序 |
| 前端手写 | 07-frontend-handwriting.md | 8 题 | Promise、深拷贝、防抖节流 |
🎯 题目总览(按难度和优先级)
第一梯队 ⭐⭐⭐(必须 100% 掌握)
| 题目 | 所属专题 | 难度 | LeetCode |
|---|---|---|---|
| 反转链表 | 链表 | 简单 | 206 |
| 两数之和 | 数组 | 简单 | 1 |
| 最大子序和 | 数组 | 中等 | 53 |
| 二叉树遍历 | 二叉树 | 中等 | 94 |
| Promise.all | 手写 | 中等 | - |
| 深拷贝 | 手写 | 中等 | - |
第二梯队 ⭐⭐(重点掌握)
| 题目 | 所属专题 | 难度 | LeetCode |
|---|---|---|---|
| K个一组翻转链表 | 链表 | 困难 | 25 |
| 前序中序重构二叉树 | 二叉树 | 中等 | 105 |
| 无重复字符最长子串 | 数组/字符串 | 中等 | 3 |
| 零钱兑换 | 动态规划 | 中等 | 322 |
| LRU 缓存 | 手写 | 中等 | 146 |
| 防抖节流 | 手写 | 简单 | - |
| call/apply/bind | 手写 | 中等 | - |
第三梯队 ⭐(了解即可)
| 题目 | 所属专题 | 难度 | LeetCode |
|---|---|---|---|
| 三数之和 | 数组 | 中等 | 15 |
| 链表环检测 | 链表 | 中等 | 141 |
| 合并K个排序链表 | 链表 | 困难 | 23 |
| 最长公共子序列 | 动态规划 | 中等 | 1143 |
| 拓扑排序 | 图 | 中等 | 207 |
| 柯里化 | 手写 | 中等 | - |
📖 学习路径
第一周:基础算法
Day 1-2: 链表专题
- 反转链表(迭代 + 递归)
- 合并有序链表
- 链表中点(快慢指针)
Day 3-4: 二叉树专题
- 前中后序遍历(递归 + 迭代)
- 层序遍历(BFS)
- 最近公共祖先
Day 5-7: 数组/字符串专题
- 两数之和(哈希表)
- 最大子序和(Kadane)
- 无重复字符最长子串(滑动窗口)第二周:进阶算法
Day 8-9: 动态规划
- 爬楼梯 / 斐波那契
- 零钱兑换
- 最长递增子序列
Day 10-11: 图算法
- DFS / BFS
- 拓扑排序
Day 12-14: 排序算法
- 快速排序(重点)
- 归并排序
- 堆排序第三周:前端手写
Day 15-16: Promise 系列
- Promise.all / race / allSettled
- Promise 完整实现
Day 17-18: 工具函数
- 深拷贝
- 防抖节流
- call / apply / bind
Day 19-21: 数据结构
- LRU 缓存
- EventEmitter
- 柯里化📝 题目格式规范
每道题目按照以下模板编写:
markdown
### 题目名称 ⭐⭐ 【梯队标记】
> **LeetCode**: [链接](url) | **难度**: 中等 | **标签**: 链表, 双指针
#### 题目描述
简洁清晰的问题描述...
#### 核心思路
1. 步骤一
2. 步骤二
#### 代码实现
\`\`\`javascript
function solution(input) {
// 实现代码
}
\`\`\`
#### 示例调用
\`\`\`javascript
// 基础示例
solution([1, 2, 3]); // 输出: 6
// 边界条件: 空输入
solution([]); // 输出: 0
// 边界条件: 单元素
solution([5]); // 输出: 5
// 边界条件: 负数
solution([-1, -2]); // 输出: -3
\`\`\`
#### 复杂度分析
- **时间**: O(n)
- **空间**: O(1)🔧 代码示例
| 文件 | 说明 |
|---|---|
| examples/sorting.js | 快排、归并排序实现 |
| examples/binary-tree.js | 二叉树遍历 |
| examples/linked-list.js | 链表操作 |
| examples/lru-cache.js | LRU 缓存实现 |
💡 常用技巧速查
数据结构选择
| 需求 | 数据结构 |
|---|---|
| 快速查找 | 哈希表 Map/Set |
| 有序数据 | 数组 + 二分查找 |
| 先进先出 | 队列 |
| 后进先出 | 栈 |
| 优先级处理 | 堆 / 优先队列 |
| 快速插入删除 | 链表 |
算法模式
| 问题类型 | 常用技巧 |
|---|---|
| 查找配对 | 哈希表 |
| 有序数组 | 双指针、二分查找 |
| 连续子串 | 滑动窗口 |
| 树遍历 | DFS(递归/栈)、BFS(队列) |
| 最优解 | 动态规划 |
| 排列组合 | 回溯 |
| 图遍历 | DFS / BFS |
| 最短路径 | BFS(无权)/ Dijkstra(带权) |
复杂度速记
O(1) - 哈希表查找、数组索引
O(log n) - 二分查找、平衡树操作
O(n) - 线性遍历、哈希表构建
O(n log n) - 高效排序(快排、归并、堆排)
O(n²) - 双重循环、简单排序
O(2^n) - 子集问题、递归未优化
O(n!) - 全排列🔗 参考资源
提示: 每道题至少手写 3 遍,理解核心思路比记住代码更重要!