学习数据结构与算法的代码示例,目前提供 Java、Python、Go 支持(C++ 也慢慢开始了)。维护这个 Repository 的目的有两个:
-
编程是一门实践的艺术,多多练习,多多思考,把这里列举的所有算法、数据结构,以及对应的常见 leetcode 习题都自己手敲几遍,增强自己的编码基本功,写出高质量的代码。
-
同时也给刷题的朋友一些指导,面对 Leetcode 上千道题目,可能会觉得手足无措,想刷题但是又不知道从哪里开始。
这里记录的是我自己的刷题过程,基本上都是一些 easy 和 medium 的题目,并且分类详细,你可以参考这个顺序,然后有针对性的去刷题。
这些题目在面试中也是比较高频的,应对大多数面试已经是绰绰有余了。
Repo 逐步完善中,欢迎补充更多题目,以及贡献代码!
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 1 | 两数之和 | Java、Python、Go、C++ | 简单 |
| 283 | 移动零 | Java、Python、Go、C++ | 简单 |
| 217 | 存在重复元素 | Java、Python、Go、C++ | 简单 |
| 219 | 存在重复元素 II | Java、Python、Go、C++ | 简单 |
| 66 | 加一 | Java、Python、Go、C++ | 简单 |
| 136 | 只出现一次的数字 | Java、Python、Go、C++ | 简单 |
| 121 | 买卖股票的最佳时机 I | Java、Python、Go | 简单 |
| 122 | 买卖股票的最佳时机 II | Java、Python、Go | 简单 |
| 88 | 合并两个有序数组 | Java、Python、Go、C++ | 简单 |
| 26 | 删除排序数组中的重复项 | Java、Python、Go、C++ | 简单 |
| 118 | 杨辉三角 | Java、Python、Go、C++ | 简单 |
| 169 | 多数元素 | Java、Python、Go、C++ | 简单 |
| 15 | 三数之和 | Java、Python、Go、C++ | 中等 |
| 189 | 旋转数组 | Java、Python、Go、C++ | 中等 |
| 11 | 装水最多的容器 | Java、Python、Go、C++ | 中等 |
| 48 | 旋转图像 | Java、Python、Go | 中等 |
| 384 | 打乱数组 | Java、Python、Go | 中等 |
| 36 | 有效的数独 | Java、Python、Go | 中等 |
| 73 | 矩阵置零 | Java、Python、Go | 中等 |
| ———————— | ———————————————— | —————————————— | ———————— |
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 206 | 反转链表 | Java、Python、Go、C++ | 简单 |
| 160 | 相交链表 | Java、Python、Go、C++ | 简单 |
| 141 | 环形链表 | Java、Python、Go、C++ | 简单 |
| 876 | 链表的中间结点 | Java、Python、Go、C++ | 简单 |
| 83 | 删除排序链表中的重复元素 | Java、Python、Go、C++ | 简单 |
| 21 | 合并两个有序链表 | Java、Python、Go、C++ | 简单 |
| 234 | 回文链表 | Java、Python、Go、C++ | 简单 |
| 142 | 环形链表II | Java、Python、Go、C++ | 中等 |
| 19 | 删除链表倒数第 N 个节点 | Java、Python、Go、C++ | 中等 |
| 24 | 两两交换链表节点 | Java、Python、Go、C++ | 中等 |
| 328 | 奇偶链表 | Java、Python、Go、C++ | 中等 |
| 2 | 两数相加 | Java、Python、Go、C++ | 中等 |
| 445 | 两数相加ii | Java、Python、Go、C++ | 中等 |
| 148 | 排序链表 | Java、Python、Go、C++ | 中等 |
| 合并 k 个升序链表 | |||
| 25 | k 个一组翻转链表 | Java、Python、Go | 困难 |
| ———————— | —————————————— | ———————————————— | ———————— |
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 20 | 有效的括号 | Java、Python、Go、C++ | 简单 |
| 155 | 最小栈 | Java、Python、Go、C++ | 简单 |
| 232 | 用栈实现队列 | Java、Python、Go、C++ | 简单 |
| 496 | 下一个更大元素 I | Java、Python、Go | 简单 |
| 856 | 括号的分数 | Java、Python、Go | 中等 |
| 84 | 柱状图中最大的矩形 | Java、Python、Go | 困难 |
| ———————— | ———————————————— | —————————————— | ———————— |
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 225 | 使用队列实现栈 | Java、Python、Go | 简单 |
| 641 | 设计循环双端队列 | Java、Python、Go | 中等 |
| 622 | 设计循环队列 | Java、Python、Go | 中等 |
| 239 | 滑动窗口的最大值 | Java、Python、Go | 困难 |
| ———————— | —————————————— | —————————————— | ———————— |
- 字符串匹配算法:
- 常见 leetcode 练习题
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 344 | 反转字符串 | Java、Python、Go | 简单 |
| 709 | 转换成小写字母 | Java、Python、Go | 简单 |
| 58 | 最后一个单词的长度 | Java、Python、Go | 简单 |
| 541 | 反转字符串 II | Java、Python、Go | 简单 |
| 7 | 整数反转 | Java、Python、Go | 简单 |
| 917 | 仅仅反转字母 | Java、Python、Go | 简单 |
| 205 | 同构字符串 | Java、Python、Go | 简单 |
| 387 | 字符串中的第一个唯一字符 | Java、Python、Go | 简单 |
| 125 | 验证回文串 | Java、Python、Go | 简单 |
| 680 | 验证回文字符串 Ⅱ | Java、Python、Go | 简单 |
| 28 | 实现 strStr() | Java、Python、Go | 简单 |
| 14 | 最长公共前缀 | Java、Python、Go | 简单 |
| 8 | 字符串转换整数 | Java、Python、Go | 中等 |
| 438 | 找到字符串中所有字母异位词 | Java、Python、Go | 中等 |
| 151 | 翻转字符串里的单词 | Java、Python、Go | 中等 |
| 557 | 反转字符串中的单词 III | Java、Python、Go | 简单 |
| 38 | 外观数列 | Java、Python、Go | 中等 |
| ———————— | —————————————— | ———————————————— | ———————— |
- 实现一个简单的哈希表【Java、Python、Go】
- 用哈希表和双向链表实现一个 Lru Cache【Java、Python、Go】
- 常见 Leetcode 练习题
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 349 | 求两个数组的交集 | Java、Python、Go | 简单 |
| 350 | 求两个数组的交集II | Java、Python、Go | 简单 |
| 242 | 有效的字母异位词 | Java、Python、Go | 简单 |
| 771 | 宝石与石头 | Java、Python、Go | 简单 |
| 49 | 字母异位词分组 | Java、Python、Go | 中等 |
| 438 | 找到字符串中所有字母异位词 | Java、Python、Go | 中等 |
| 146 | 实现 lru 缓存 | Java、Python、Go | 中等 |
| 380 | 常数时间插入、删除和获取随机元素 | Java、Python、Go | 中等 |
| ———————— | ———————————————— | —————————————— | ———————— |
-
并查集的基本代码模板【Java、Python、Go】
-
常见 leetcode 练习题
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 547 | 朋友圈 | Java、Python、Go | 中等 |
| 200 | 岛屿数量 | Java、Python、Go | 中等 |
| 120 | 被围绕的区域 | Java、Python、Go | 中等 |
| ———————— | ———————————————— | —————————————— | ———————— |
- 实现一个二叉堆【Java、Python、Go】
- 常见 leetcode 练习题
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 剑指 Offer 40 | 最小的 k 的元素 | Java、Python、Go | 简单 |
| 703 | 数据流中的第 k 大元素 | Java、Python、Go | 简单 |
| 347 | 前 k 个高频元素 | Java、Python、Go | 中等 |
| 215 | 数组中第 k 个最大元素 | Java、Python、Go | 中等 |
| 239 | 滑动窗口的最大值 | Java、Python、Go | 困难 |
| ———————— | ———————————————— | ———————————————— | ———————— |
- 实现一个二叉搜索树【Java、Python、Go】
- 常见 leetcode 练习题:
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 144 | 二叉树的前序遍历 | Java、Python、Go | 中等 |
| 94 | 二叉树的中序遍历 | Java、Python、Go | 中等 |
| 145 | 二叉树的后序遍历 | Java、Python、Go | 中等 |
| 102 | 二叉树的层次遍历 | Java、Python、Go | 中等 |
| 107 | 二叉树的层次遍历 II | Java、Python、Go、C++ | 简单 |
| 637 | 二叉树的层平均值 | Java、Python、Go | 简单 |
| 103 | 二叉树的锯齿形层次遍历 | Java、Python、Go | 中等 |
| 199 | 二叉树的右视图 | Java、Python、Go、C++ | 中等 |
| 104 | 二叉树的最大深度 | Java、Python、Go、C++ | 简单 |
| 559 | N 叉树的最大深度 | Java、Python、Go、C++ | 简单 |
| 111 | 二叉树的最小深度 | Java、Python、Go、C++ | 简单 |
| 662 | 二叉树最大宽度 | Java、Python、Go、C++ | 中等 |
| 230 | 二叉搜索树中第 K 小元素 | Java、Python、Go | 中等 |
| 98 | 验证二叉搜索树 | Java、Python、Go | 中等 |
| 101 | 对称二叉树 | Java、Python、Go | 简单 |
| 112 | 路径总和 | Java、Python、Go、C++ | 简单 |
| 108 | 有序数组转换为二叉搜索树 | Java、Python、Go | 简单 |
| 129 | 求根到叶子节点数字之和 | Java、Python、Go | 中等 |
| 116 | 填充每个节点的下一个右侧节点指针 | Java、Python、Go | 中等 |
| 105 | 从前序与中序遍历序列构造二叉树 | Java、Python、Go、C++ | 中等 |
| 589 | N叉树的前序遍历 | Java、Python、Go | 简单 |
| 590 | N叉树的后序遍历 | Java、Python、Go | 简单 |
| 429 | N叉树的层次遍历 | Java、Python、Go | 中等 |
| 226 | 翻转二叉树 | Java、Python、Go、C++ | 简单 |
| ———————— | —————————————— | ———————————————— | ———————— |
- 实现一个字典树【Java、Python、Go】
- 常见 leetcode 练习题
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 208 | 实现一个 Trie (字典树) | Java、Python、Go | 中等 |
| 212 | 单词搜索II | Java、Python、Go | 困难 |
| ———————— | —————————————— | ———————————————— | ———————— |
- 冒泡排序【Java、Python、Go】
- 选择排序【Java、Python、Go】
- 插入排序【Java、Python、Go】
- 希尔排序【Java、Python、Go】
- 归并排序【Java、Python、Go】
- 快速排序【Java、Python、Go】
- 堆排序【Java、Python、Go】
- 桶排序【Java、Python、Go】
- 计数排序【Java、Python、Go】
- 基数排序【Java、Python、Go】
- 常见 leetcode 练习题
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 颜色排序 | Java、Python、Go | 简单 | |
| 1122 | 数组的相对排序 | Java、Python、Go | 简单 |
| 242 | 有效的字母异位词 | Java、Python、Go | 简单 |
| 56 | 合并区间 | Java、Python、Go | 中等 |
| 493 | 翻转对 | Java、Python、Go | 困难 |
| ———————— | ———————————————— | —————————————— | ———————— |
- 实现二分查找的标准代码模板【Java、Python、Go、C++】
- 常见 leetcode 练习题:
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 278 | 第一个错误的版本 | Java、Python、Go、C++ | 简单 |
| 367 | 有效的完全平方数 | Java、Python、Go、C++ | 简单 |
| 69 | x 的平方根 | Java、Python、Go、C++ | 简单 |
| 162 | 寻找峰值 | Java、Python、Go、C++ | 中等 |
| 34 | 在排序数组中查找元素的第一个和最后一个位置 | Java、Python、Go、C++ | 中等 |
| 33 | 搜索旋转排序数组 | Java、Python、Go、C++ | 中等 |
| 153 | 搜索旋转排序数组中的最小值 | Java、Python、Go、C++ | 中等 |
| 540 | 有序数组中的单一元素 | Java、Python、Go、C++ | 中等 |
| ———————— | ———————————————— | ———————————————— | ———————— |
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 127 | 单词接龙 | Java、Python、Go | 中等 |
| 朋友圈 | |||
| 岛屿数量 | |||
| 433 | 最小基因变化 | Java、Python、Go | 中等 |
| ———————— | —————————————— | ———————————————— | ———————— |
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 分糖果 | Java、Python、Go | 中等 | |
| 跳跃游戏 | Java、Python、Go | 中等 | |
| 跳跃游戏II | Java、Python、Go | 困难 | |
| ———————— | —————————————— | ———————————————— | ———————— |
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 79 | 单词搜索 | Java、Python、Go | 中等 |
| 22 | 括号生成 | Java、Python、Go | 中等 |
| 全排列 | |||
| 全排列II | |||
| 子集 | |||
| 547 | 朋友圈 | Java、Python、Go | 中等 |
| N 皇后 | Java、Python、Go | 困难 | |
| 52 | N 皇后 II | Java、Python、Go | 困难 |
| ———————— | —————————————— | ———————————————— | ———————— |
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 50 | Pow(x, n) | Java、Python、Go | 中等 |
| ———————— | —————————————— | ———————————————— | ———————— |
| 题号 | 题目名称 | 解题代码 | 难度 |
|---|---|---|---|
| 爬楼梯 | |||
| 746 | 使用最小花费爬楼梯 | Java、Python、Go | 简单 |
| 53 | 最大子序和 | Java、Python、Go | 简单 |
| 三角形的最短路径和 | |||
| 64 | 最小路径和 | Java、Python、Go | 中等 |
| 62 | 不同路径 | Java、Python、Go | 中等 |
| 63 | 不同路径II | Java、Python、Go | 中等 |
| 乘积最大子数组 | Java、Python、Go | ||
| 1143 | 最长公共子序列 | Java、Python、Go | 中等 |
| 583 | 两个字符串的删除操作 | Java、Python、Go | 中等 |
| 300 | 最长上升子序列 | Java、Python、Go | 中等 |
| 最大正方形 | Java、Python、Go | ||
| 198 | 打家劫舍 | Java、Python、Go | 简单 |
| 打家劫舍II | Java、Python、Go | ||
| 按摩师 | Java、Python、Go | 简单 | |
| 91 | 解码方法 | Java、Python、Go | 中等 |
| 72 | 编辑距离 | Java、Python、Go | 困难 |
| ———————— | ———————————————— | —————————————— | ———————— |