LeetCode
LeetCode 是全球最大的技术面试刷题平台,也是准备算法面试的首选网站。
平台简介
| 属性 | 信息 |
|---|---|
| 网址 | https://leetcode.com |
| 语言支持 | 几乎所有主流语言 |
| 题目数量 | 3000+ |
| 用户规模 | 千万级 |
| 特色 | 面试导向、题解丰富、讨论活跃 |
与竞赛平台对比
LeetCode vs 算法竞赛平台
─────────────────────────────────────────
LeetCode特点:
- 题目侧重面试考点
- 数据范围较小
- 强调代码简洁性
- 讨论区侧重解释思路
- 有明确的公司标签
竞赛平台特点:
- 题目侧重算法思维
- 数据范围大,需要优化
- 强调算法效率
- 讨论区侧重代码实现
- 有明确的难度分档
─────────────────────────────────────────
题目分类与刷题路线
面试必刷 200 题路线
第一阶段:基础(1-2周)
─────────────────────────────────────────
数组
├── 两数之和 (#1)
├── 盛最多水的容器 (#11)
├── 三数之和 (#15)
└── 缺失的第一个正数 (#41)
链表
├── 两数相加 (#2)
├── 合并两个有序链表 (#21)
├── 翻转链表 (#206)
└── 环形链表 (#141)
栈与队列
├── 有效的括号 (#20)
├── 最小栈 (#155)
└── 每日温度 (#739)
─────────────────────────────────────────
第二阶段:进阶(2-4周)
─────────────────────────────────────────
二叉树
├── 前/中/后序遍历
├── 层序遍历 (#102)
├── 二叉树最大深度 (#104)
├── 路径总和 (#112)
├── 二叉树翻转 (#226)
└── 最近公共祖先 (#236)
动态规划
├── 爬楼梯 (#70)
├── 最大子数组和 (#53)
├── 最长递增子序列 (#300)
├── 零钱兑换 (#322)
├── 编辑距离 (#72)
└── 股票买卖系列
回溯
├── 全排列 (#46)
├── N皇后 (#51)
├── 组合总和 (#39)
└── 子集 (#78)
─────────────────────────────────────────
第三阶段:高级(4-8周)
─────────────────────────────────────────
图论
├── 岛屿数量 (#200)
├── 课程表 (#207)
├── 实现Trie树 (#208)
└── 单词接龙 (#127)
高级数据结构
├── LRU缓存 (#146)
├── 并查集
└── 线段树
高级算法
├── 字典树
├── 并查集
├── 拓扑排序
└── 最短路径
─────────────────────────────────────────
高频考点
大厂面试 Top 100
# LeetCode 热题 100 分类统计
hot_100_categories = {
'数组': 15,
'链表': 10,
'哈希表': 12,
'字符串': 10,
'双指针': 8,
'栈与队列': 6,
'二叉树': 15,
'回溯': 8,
'贪心': 5,
'动态规划': 20,
'图论': 6,
'数学': 5
}
按公司分类
| 公司 | 高频题目 | 特点 |
|---|---|---|
| 字节跳动 | 滑动窗口、双指针、DP | 题量大,难度中等 |
| 阿里巴巴 | 二叉树、链表、字符串 | 注重代码质量 |
| 腾讯 | 图论、DP、设计题 | 综合性强 |
| 美团 | 基础算法、场景题 | 注重思维过程 |
| 图论、高级数据结构 | 难度较高 | |
| 数组、字符串、设计 | 注重工程能力 |
刷题技巧
五步刷题法
LeetCode 高效刷题法
─────────────────────────────────────────
1. 审题 (5分钟)
- 理解题意
- 明确输入输出
- 考虑边界情况
2. 思考 (10-15分钟)
- 暴力解法
- 优化思路
- 时间复杂度分析
3. 实现 (15-20分钟)
- 编写代码
- 自己测试
- 调试bug
4. 学习 (10分钟)
- 看题解
- 学习最优解
- 总结套路
5. 复习 (隔天/一周后)
- 不看答案重做
- 确保真正掌握
─────────────────────────────────────────
代码模板
// 二叉树遍历模板
class Solution {
public:
// 前序遍历
void preorder(TreeNode* root, vector<int>& res) {
if (!root) return;
res.push_back(root->val);
preorder(root->left, res);
preorder(root->right, res);
}
// 中序遍历
void inorder(TreeNode* root, vector<int>& res) {
if (!root) return;
inorder(root->left, res);
res.push_back(root->val);
inorder(root->right, res);
}
// 层序遍历
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if (!root) return res;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int sz = q.size();
vector<int> level;
for (int i = 0; i < sz; i++) {
TreeNode* node = q.front(); q.pop();
level.push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
res.push_back(level);
}
return res;
}
};
// 动态规划模板
class Solution {
public:
// 记忆化搜索
int dfs(vector<int>& nums, int i, vector<int>& memo) {
if (i >= nums.size()) return 0;
if (memo[i] != -1) return memo[i];
// 选 or 不选
int res = max(dfs(nums, i+1, memo),
nums[i] + dfs(nums, i+2, memo));
return memo[i] = res;
}
// 递推写法
int dp(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n+1);
dp[0] = 0;
dp[1] = nums[0];
for (int i = 2; i <= n; i++) {
dp[i] = max(dp[i-1], dp[i-2] + nums[i-1]);
}
return dp[n];
}
// 空间优化
int optimized(vector<int>& nums) {
int prev2 = 0, prev1 = 0;
for (int num : nums) {
int cur = max(prev1, prev2 + num);
prev2 = prev1;
prev1 = cur;
}
return prev1;
}
};
周赛参与
周赛信息
LeetCode Weekly Contest
─────────────────────────────────────────
时间:每周日 10:30 PM (北京时间)
时长:1.5小时
题目:4道
难度:递进(Easy → Hard)
奖励:
- 前500名获得积分
- 全球排名展示
- 虚拟参赛可练习
─────────────────────────────────────────
周赛策略
- 快速AC第一题(5分钟内)
- 稳做第二题(15分钟内)
- 挑战第三题(30-40分钟)
- 根据情况决定是否挑战第四题
面试准备
面试前准备
面试刷题计划(2-4周)
─────────────────────────────────────────
Week 1: 数组、链表、字符串
Week 2: 二叉树、栈队列、哈希
Week 3: 动态规划、贪心
Week 4: 图论、高级数据结构
每日计划:
- 新题 3-5 道
- 复习旧题 5-10 道
- 模拟面试 1 场(周末)
─────────────────────────────────────────
面试中的代码规范
// 好的代码风格示例
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
// 1. 边界检查
if (nums.size() < 2) return {};
// 2. 使用合适的数据结构
unordered_map<int, int> mp;
// 3. 清晰的变量命名
for (int i = 0; i < nums.size(); i++) {
int complement = target - nums[i];
// 4. 提前返回
if (mp.count(complement)) {
return {mp[complement], i};
}
mp[nums[i]] = i;
}
// 5. 处理无解情况
return {};
}
};
与其他平台配合
推荐学习路径
─────────────────────────────────────────
零基础 → LeetCode Easy → 建立信心
↓
有基础 → 配合洛谷 → 系统学习算法
↓
冲面试 → LeetCode 200题 → 覆盖考点
↓
提能力 → Codeforces → 锻炼思维
─────────────────────────────────────────
总结
LeetCode 是准备技术面试的必刷平台,但不适合作为算法竞赛的主要训练场。建议:
- 以面试为目标:重点刷 Hot 100 和剑指 Offer
- 以能力提升为目标:配合竞赛平台系统学习
- 保持每日刷题:养成习惯,保持手感