跳到主要内容

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、设计题综合性强
美团基础算法、场景题注重思维过程
Google图论、高级数据结构难度较高
Facebook数组、字符串、设计注重工程能力

刷题技巧

五步刷题法

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名获得积分
- 全球排名展示
- 虚拟参赛可练习
─────────────────────────────────────────

周赛策略

  1. 快速AC第一题(5分钟内)
  2. 稳做第二题(15分钟内)
  3. 挑战第三题(30-40分钟)
  4. 根据情况决定是否挑战第四题

面试准备

面试前准备

面试刷题计划(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
  • 以能力提升为目标:配合竞赛平台系统学习
  • 保持每日刷题:养成习惯,保持手感