LeetCode 题解与刷题指南
项目结构概览
本仓库以 C++ 为主要实现语言,系统地收录了 LeetCode 题目的解题代码与学习笔记。代码组织遵循以下约定:
- 每道题目对应一个独立的目录,命名格式为
{题号}_{题目名称}(如0001_two_sum) - 每个题目目录下包含
solution.cpp实现文件 - 题目笔记统一存放在
notes.md文件中,按难度和主题分类
刷题路线建议
根据仓库中的 hot100/notes.md,推荐以下学习路径:
基础阶段
- 数组与字符串:掌握双指针、滑动窗口技巧
- 链表:熟悉快慢指针、原地修改技术
- 哈希表:理解时间空间权衡,重点掌握一遍哈希
提高阶段
- 树与图:掌握递归遍历、BFS/DFS 应用
- 动态规划:从状态定义入手,练习背包类、序列类问题
- 堆与栈:掌握优先队列应用场景
冲刺阶段
- 高频题目:重点刷取 Hot 100 题单
- 时间复杂度分析:每道题练习说出最优解的时间空间复杂度
- 举一反三:变形题目练习,培养举一反三能力
核心算法模板
数组双指针技巧
// 左右指针
int left = 0, right = n - 1;
while (left < right) {
// 处理逻辑
if (condition) left++;
else right--;
}
// 快慢指针
int slow = 0;
for (int fast = 0; fast < n; fast++) {
if (condition) {
// 处理逻辑
nums[slow++] = nums[fast];
}
}
哈希表应用
// 一遍哈希
unordered_map<int, int> map;
for (int i = 0; i < nums.size(); i++) {
int complement = target - nums[i];
if (map.find(complement) != map.end()) {
// 找到解
return {map[complement], i};
}
map[nums[i]] = i;
}
链表操作
// 快慢指针查找中间节点
ListNode* slow = head;
ListNode* fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
// 原地反转链表
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr) {
ListNode* nextTemp = curr->next;
curr->next = prev;
prev = curr;
curr = nextTemp;
}
题目分类与解题策略
简单难度题目
以 0001_two_sum 为例,解题思路如下:
- 暴力解法:两层循环 O(n²) 时间复杂度
- 优化方案:使用哈希表将时间复杂度降至 O(n)
- 关键点:空间换时间,建立值到索引的映射
中等难度题目
参考 Hot 100 题单中的典型题型:
- 滑动窗口:用于子数组/子字符串问题
- 二分查找:在有序数组中查找特定元素
- 栈的应用:有效括号、每日温度等问题
困难难度题目
通常需要综合运用多种技巧:
- 动态规划 + 状态压缩
- 贪心算法 + 堆优化
- 图论算法 + 剪枝技巧
代码质量与规范
命名约定
- 变量命名采用驼峰式(camelCase)
- 常量使用全大写加下划线(UPPER_SNAKE_CASE)
- 函数命名采用动词短语,如
findTargetSumWays
注释规范
- 复杂算法前添加简要说明
- 关键变量说明其含义
- 特殊处理逻辑添加注释说明原因
错误处理
- 输入参数合法性检查
- 边界条件特殊处理
- 异常情况的优雅降级
学习资源与进阶建议
必读资料
- 《算法导论》 - 基础算法理论
- 《编程珠玑》 - 算法设计思路
- LeetCode 官方题解 - 不同语言实现参考
练习平台推荐
- LeetCode 中文官网:题目分类完整,讨论区活跃
- 现在编程(NowCoder):校招真题较多
- CodeTop:高频面试题集合
进阶方向
- 算法竞赛:参考《挑战程序设计竞赛》
- 系统设计:学习分布式系统原理
- 性能优化:深入理解 CPU 缓存、内存对齐等知识
常见问题解答
Q:如何快速定位题目解法?
A:仓库采用 {题号}_{题目名称} 的目录命名方式,可直接通过题号查找。例如想看两数之和的解法,进入 cpp/problems/leetcode/0001_two_sum/ 目录。
Q:代码是否支持最新 C++ 标准?
A:代码主要使用 C++11 及以上特性,如 auto 类型推导、范围for循环、lambda 表达式等。
Q:如何贡献自己的题解?
A: fork 本仓库,在 cpp/problems/leetcode/ 下创建新的题目目录,遵循现有目录结构和命名规范提交 Pull Request。
Q:刷题过程中遇到瓶颈怎么办?
A:建议:
1. 先看官方题解理解思路
2. 不看代码尝试自己实现
3. 对比实现差异,总结不足
4. 相似题目进行变形练习
更新日志
- 2024-01-15:初始化仓库结构,添加基础题目解法
- 2024-02-01:完成 Hot 100 前 50 题的解题笔记
- 2024-03-10:添加算法模板和刷题建议章节
- 2024-04-20:更新 C++17 特性使用示例