LeetCode 题解, Solutions to LeetCode by Python
如果是新手刷题的话,推荐先从简单等级的算法题开始刷起。等简单题上手熟练之后,再开始按照标签类别,刷中等难度的题。中等难度的题刷差不多之后,可以考虑刷面试题 or 难题。
其实 LeetCode 官方网站上就有整理好的刷题清单。链接为:https://leetcode-cn.com/leetbook/
我这里稍微做了一下整理。推荐刷题顺序如下:
「5 分钟思考法」意思就是如果一道题如果 5 分钟之内有思路,就立即动手解题。如果 5 分钟之后还没有思路,就直接去看题解。然后根据题解的思路,自己去实现代码。如果发现自己看了题解也无法实现代码,就认真阅读题解的代码,并理解代码的逻辑。
刷题其实跟英语里边的背单词过程是类似的。
一开始,先学简单的单词,掌握了基本词汇之后,再学习词组,学习句子,然后再看文章。而且,背单词的时候也不是背一遍就会了。而是不断的重复记忆。
算法刷题也是一样,零基础刷题的时候,不要过分纠结怎么自己就想不出来算法的解法,怎么就想不到更加高效的方法。学英语的时候,不也是从第一个字母开始学起的嘛。
一开始的时候,不会做的题就去看题解,尽可能的快速入门。
算法题有时候一遍刷过去,过的时间长了可能就忘了,看到之前做的题不能够立马想到解题思路。这其实还是跟背单词一样,单词也不是看一遍就完全记住了。所以题目刷完一遍并不是结束了,还需要不断的回顾。
而且,一道题目可能有多种解法,还可能有复杂度更低的算法思路。
最开始做的时候,可能是一种思路,再做第二遍的时候,可能会想到了新的解法,新的优化方式等等。
所以,算法题一遍之后遇见不会的,还可以多刷几遍,不断加深理解。
刷算法题,有一个十分有用的捷径,就是「写解题报告」。如果你刷完一道题,能把这道题的解题步骤,做题思路用通俗易懂的话写成解题报告,那么这道题就算是掌握了。其实就相当于「费曼学习法」的思维。这样,也可以减少刷题的遍数,遇到之前刷过的题,但一时之间没有思路的,可以看看自己之前的解题报告。这样就节省了大量重复刷题的时间。
题号 | 标题 | 题解 | 标签 | 难度 |
---|---|---|---|---|
0001 | 两数之和 | Python | 数组、哈希表 | 简单 |
0002 | 两数相加 | Python | 递归、链表、数学 | 中等 |
0003 | 无重复字符的最长子串 | Python | 字符串、哈希表、双指针、字符串、滑动窗口 | 中等 |
0004 | 寻找两个正序数组的中位数 | Python | 数组、二分查找、分治算法 | 困难 |
0005 | 最长回文子串 | Python | 字符串、动态规划 | 中等 |
0007 | 整数反转 | Python | 数学 | 简单 |
0008 | 字符串转换整数 (atoi) | Python | 数学、字符串 | 中等 |
0009 | 回文数 | Python | 数学 | 简单 |
0012 | 整数转罗马数字 | Python | 数学、字符串 | 中等 |
0013 | 罗马数字转整数 | Python | 数学、字符串 | 简单 |
0014 | 最长公共前缀 | Python | 字符串 | 简单 |
0015 | 三数之和 | Python | 数组、双指针 | 中等 |
0017 | 电话号码的字母组合 | Python | 深度优先搜索、递归、字符串、回溯算法 | 中等 |
0018 | 四数之和 | Python | 数组、哈希表、双指针 | 中等 |
0019 | 删除链表的倒数第 N 个结点 | Python | 链表、双指针 | 中等 |
0020 | 有效的括号 | Python | 栈、字符串 | 简单 |
0021 | 合并两个有序链表 | Python | 递归、链表 | 简单 |
0022 | 括号生成 | Python | 字符串、回溯算法 | 中等 |
0024 | 两两交换链表中的节点 | Python | 递归、链表 | 中等 |
0026 | 删除有序数组中的重复项 | Python | 数组、双指针 | 简单 |
0027 | 移除元素 | Python | 数组、双指针 | 简单 |
0028 | 实现 strStr() | Python | 字符串、双指针 | 简单 |
0029 | 两数相除 | Python | 数学、二分查找 | 中等 |
0034 | 在排序数组中查找元素的第一个和最后一个位置 | Python | 数组、二分查找 | 中等 |
0035 | 搜索插入位置 | Python | 数组、二分查找 | 简单 |
0036 | 有效的数独 | Python | 哈希表 | 中等 |
0038 | 外观数列 | Python | 字符串 | 简单 |
0046 | 全排列 | Python | 回溯算法 | 中等 |
0048 | 旋转图像 | Python | 数组 | 中等 |
0049 | 字母异位词分组 | Python | 字符串、哈希表 | 中等 |
0050 | Pow(x, n) | Python | 数学、二分查找 | 中等 |
0053 | 最大子序和 | Python | 数组、分治算法、动态规划 | 简单 |
0054 | 螺旋矩阵 | Python | 数组 | 中等 |
0055 | 跳跃游戏 | Python | 贪心算法、数组、动态规划 | 中等 |
0056 | 合并区间 | Python | 数组、排序 | 中等 |
0058 | 最后一个单词的长度 | Python | 字符串 | 简单 |
0061 | 旋转链表 | Python | 链表、双指针 | 中等 |
0062 | 不同路径 | Python | 数组、动态规划 | 中等 |
0066 | 加一 | Python | 数组 | 简单 |
0067 | 二进制求和 | Python | 数学、字符串、位运算 | 简单 |
0069 | x 的平方根 | Python | 数学、二分查找 | 简单 |
0070 | 爬楼梯 | Python | 动态规划 | 简单 |
0073 | 矩阵置零 | Python | 数组 | 中等 |
0075 | 颜色分类 | Python | 数组、排序、双指针 | 中等 |
0078 | 子集 | Python | 位运算、数组、回溯算法 | 中等 |
0079 | 单词搜索 | Python | 数组、回溯算法 | 中等 |
0080 | 删除有序数组中的重复项 II | Python | 数组、双指针 | 中等 |
0083 | 删除排序链表中的重复元素 | Python | 链表 | 简单 |
0088 | 合并两个有序数组 | Python | 数组、双指针 | 简单 |
0091 | 解码方法 | Python | 字符串、动态规划 | 中等 |
0094 | 二叉树的中序遍历 | Python | 栈、树、哈希表 | 简单 |
0098 | 验证二叉搜索树 | Python | 树、深度优先搜索、递归 | 中等 |
0100 | 相同的树 | Python | 树、深度优先搜索 | 简单 |
0101 | 对称二叉树 | Python | 树、深度优先搜索、广度优先搜索 | 简单 |
0102 | 二叉树的层序遍历 | Python | 树、广度优先搜索 | 中等 |
0103 | 二叉树的锯齿形层序遍历 | Python | 简单 | |
0104 | 二叉树的最大深度 | Python | 树、深度优先搜索、递归 | 简单 |
0107 | 二叉树的层序遍历 II | Python | 树、广度优先搜索 | 中等 |
0108 | 将有序数组转换为二叉搜索树 | Python | 树、深度优先搜索 | 简单 |
0110 | 平衡二叉树 | Python | 树、深度优先搜索、递归 | 简单 |
0111 | 二叉树的最小深度 | Python | 树、深度优先搜索、广度优先搜索 | 简单 |
0112 | 路径总和 | Python | 树、深度优先搜索 | 简单 |
0116 | 填充每个节点的下一个右侧节点指针 | Python | 树、深度优先搜索、广度优先搜索 | 中等 |
0117 | 填充每个节点的下一个右侧节点指针 II | Python | 树、深度优先遍历 | 中等 |
0118 | 杨辉三角 | Python | 数组 | 简单 |
0119 | 杨辉三角 II | Python | 数组 | 简单 |
0121 | 买卖股票的最佳时机 | Python | 数组、动态规划 | 简单 |
0122 | 买卖股票的最佳时机 II | Python | 数组、贪心算法 | 简单 |
0125 | 验证回文串 | Python | 字符串、双指针 | 简单 |
0133 | 克隆图 | Python | 深度优先搜索、广度优先搜索、图 | 中等 |
0136 | 只出现一次的数字 | Python | 位运算、位运算 | 简单 |
0138 | 复制带随机指针的链表 | Python | 链表、哈希表 | 中等 |
0141 | 环形链表 | Python | 链表、双指针 | 简单 |
0142 | 环形链表 II | Python | 链表、双指针 | 中等 |
0144 | 二叉树的前序遍历 | Python | 栈、树 | 中等 |
0145 | 二叉树的后序遍历 | Python | 栈、树 | 简单 |
0149 | 直线上最多的点数 | Python | 哈希表、数学 | 困难 |
0150 | 逆波兰表达式求值 | Python | 栈 | 中等 |
0152 | 乘积最大子数组 | Python | 数组、动态规划 | 中等 |
0153 | 寻找旋转排序数组中的最小值 | Python | 数组、二分查找 | 中等 |
0155 | 最小栈 | Python | 栈、设计 | 简单 |
0159 | 至多包含两个不同字符的最长子串 | Python | 哈希表、双指针、字符串、滑动窗口 | 中等 |
0160 | 相交链表 | Python | 链表、双指针 | 简单 |
0166 | 分数到小数 | Python | 哈希表、数学 | 中等 |
0167 | 两数之和 II - 输入有序数组 | Python | 数组、双指针、二分查找 | 简单 |
0168 | Excel表列名称 | Python | 数学 | 简单 |
0169 | 多数元素 | Python | 数组、哈希表 | 简单 |
0170 | 两数之和 III - 数据结构设计 | Python | 设计、哈希表 | 简单 |
0173 | 二叉搜索树迭代器 | Python | 栈、树、设计 | 中等 |
0189 | 旋转数组 | Python | 数组 | 中等 |
0190 | 颠倒二进制位 | Python | 位运算 | 简单 |
0191 | 位1的个数 | Python | 位运算 | 简单 |
0198 | 打家劫舍 | Python | 动态规划 | 中等 |
0199 | 二叉树的右视图 | Python | 树、深度优先搜索、广度优先搜索、递归、队列 | 中等 |
0200 | 岛屿数量 | Python | 搜索 | 中等 |
0202 | 快乐数 | Python | 哈希表、数学 | 简单 |
0203 | 移除链表元素 | Python | 链表 | 简单 |
0204 | 计数质数 | Python | 数学、哈希表 | 简单 |
0205 | 同构字符串 | Python | 哈希表 | 简单 |
0206 | 反转链表 | Python | 链表 | 简单 |
0209 | 长度最小的子数组 | Python | 数组、双指针、二分查找 | 中等 |
0213 | 打家劫舍 II | Python | 动态规划 | 中等 |
0215 | 数组中的第K个最大元素 | Python | 数组、堆排序 | 中等 |
0217 | 存在重复元素 | Python | 数组、哈希表 | 简单 |
0219 | 存在重复元素 II | Python | 数组、哈希表 | 简单 |
0220 | 存在重复元素 III | Python | 排序、有序集合、哈希表 | 中等 |
0223 | 矩形面积 | Python | 数学 | 简单 |
0225 | 用队列实现栈 | Python | 栈、设计 | 简单 |
0226 | 翻转二叉树 | Python | 树、递归 | 简单 |
0227 | 基本计算器 II | Python | 栈、字符串 | 中等 |
0231 | 2的幂 | Python | 位运算、数学 | 简单 |
0232 | 用栈实现队列 | Python | 栈、设计 | 简单 |
0234 | 回文链表 | Python | 链表、双指针 | 简单 |
0235 | 二叉搜索树的最近公共祖先 | Python | 树 | 简单 |
0236 | 二叉树的最近公共祖先 | Python | 树 | 中等 |
0237 | 删除链表中的节点 | Python | 链表 | 简单 |
0238 | 除自身以外数组的乘积 | Python | 数组 | 中等 |
0240 | 搜索二维矩阵 II | Python | 二分查找、分治算法 | 中等 |
0242 | 有效的字母异位词 | Python | 字符串、哈希表、排序 | 简单 |
0249 | 移位字符串分组 | Python | 哈希表、字符串 | 中等 |
0257 | 二叉树的所有路径 | Python | 树、深度优先搜索 | 简单 |
0258 | 各位相加 | Python | 数学 | 简单 |
0268 | 丢失的数字 | Python | 位运算、数组、数学 | 简单 |
0270 | 最接近的二叉搜索树值 | Python | 树、二分查找 | 简单 |
0278 | 第一个错误的版本 | Python | 数组、二分查找 | 简单 |
0279 | 完全平方数 | Python | 广度优先搜索、数学、动态规划 | 中等 |
0283 | 移动零 | Python | 数组、双指针 | 简单 |
0286 | 墙与门 | Python | 广度优先搜索 | 中等 |
0287 | 寻找重复数 | Python | 数组、双指针、二分查找 | 中等 |
0288 | 单词的唯一缩写 | Python | 设计、哈希表 | 中等 |
0290 | 单词规律 | Python | 哈希表 | 简单 |
0292 | Nim 游戏 | Python | 数学 | 简单 |
0297 | 二叉树的序列化与反序列化 | Python | 树、设计 | 困难 |
0300 | 最长递增子序列 | Python | 二分查找、动态规划 | 中等 |
0322 | 零钱兑换 | Python | 动态规划 | 中等 |
0326 | 3 的幂 | Python | 数学 | 简单 |
0328 | 奇偶链表 | Python | 链表 | 中等 |
0334 | 递增的三元子序列 | Python | 中等 | |
0342 | 4的幂 | Python | 位运算 | 简单 |
0344 | 反转字符串 | Python | 字符串 | 简单 |
0345 | 反转字符串中的元音字母 | Python | 字符串 | 简单 |
0347 | 前 K 个高频元素 | Python | 堆、哈希表 | 中等 |
0349 | 两个数组的交集 | Python | 数组、哈希表 | 简单 |
0350 | 两个数组的交集 II | Python | 数组、哈希表 | 简单 |
0354 | 俄罗斯套娃信封问题 | Python | 动态规划、二分查找 | 困难 |
0359 | 日志速率限制器 | Python | 设计、哈希表 | 简单 |
0367 | 有效的完全平方数 | Python | 数学、二分查找 | 简单 |
0371 | 两整数之和 | Python | 位运算 | 中等 |
0374 | 猜数字大小 | Python | 二分查找 | 简单 |
0380 | 常数时间插入、删除和获取随机元素 | Python | 数组、哈希表 | 中等 |
0387 | 字符串中的第一个唯一字符 | Python | 字符串、哈希表 | 简单 |
0389 | 找不同 | Python | 位运算、哈希表 | 简单 |
0394 | 字符串解码 | Python | 栈、深度优先搜索 | 中等 |
0404 | 左叶子之和 | Python | 树 | 简单 |
0410 | 分割数组的最大值 | Python | 二分查找、动态规划 | 困难 |
0412 | Fizz Buzz | Python | 简单 | |
0415 | 字符串相加 | Python | 字符串、大数加法 | 简单 |
0424 | 替换后的最长重复字符 | Python | 双指针、滑动窗口 | 中等 |
0430 | 扁平化多级双向链表 | Python | 链表 | 中等 |
0447 | 回旋镖的数量 | Python | 哈希表、数学 | 中等 |
0450 | 删除二叉搜索树中的节点 | Python | 树 | 中等 |
0454 | 四数相加 II | Python | 哈希表 | 中等 |
0461 | 汉明距离 | Python | 位运算 | 简单 |
0485 | 最大连续 1 的个数 | Python | 数组 | 简单 |
0494 | 目标和 | Python | 深度优先搜索、动态规划 | 中等 |
0504 | 七进制数 | Python | 简单 | |
0509 | 斐波那契数 | Python | 数组 | 简单 |
0542 | 01 矩阵 | Python | 深度优先搜索、广度优先搜索 | 中等 |
0543 | 二叉树的直径 | Python | 二叉树 | 简单 |
0557 | 反转字符串中的单词 III | Python | 字符串 | 简单 |
0561 | 数组拆分 I | Python | 数组 | 简单 |
0599 | 两个列表的最小索引总和 | Python | 哈希表 | 简单 |
0621 | 任务调度器 | Python | 贪心算法、队列、数组 | 中等 |
0622 | 设计循环队列 | Python | 队列 | 中等 |
0633 | 平方数之和 | Python | 双指针 | 中等 |
0652 | 寻找重复的子树 | Python | 树、哈希表 | 中等 |
0658 | 找到 K 个最接近的元素 | Python | 二分查找 | 中等 |
0665 | 非递减数列 | Python | 数组 | 简单 |
0673 | 最长递增子序列的个数 | Python | 动态规划 | 中等 |
0690 | 员工的重要性 | Python | 深度优先搜索、广度优先搜索、哈希表 | 简单 |
0695 | 岛屿的最大面积 | Python | 搜索 | 中等 |
0700 | 二叉搜索树中的搜索 | Python | 数 | 简单 |
0701 | 二叉搜索树中的插入操作 | Python | 树 | 中等 |
0702 | 搜索长度未知的有序数组 | Python | 二分查找 | 中等 |
0704 | 二分查找 | Python | 二分查找 | 简单 |
0705 | 设计哈希集合 | Python | 哈希表 | 简单 |
0706 | 设计哈希映射 | Python | 哈希表 | 简单 |
0707 | 设计链表 | Python | 链表 | 中等 |
0719 | 找出第 k 小的距离对 | Python | 堆、数组、二分查找 | 困难 |
0724 | 寻找数组的中心下标 | Python | 数组 | 简单 |
0733 | 图像渲染 | Python | 深度优先搜索 | 简单 |
0739 | 每日温度 | Python | 栈、哈希表 | 中等 |
0744 | 寻找比目标字母大的最小字母 | Python | 二分查找 | 简单 |
0752 | 打开转盘锁 | Python | 广度优先搜索 | 中等 |
0779 | 第K个语法符号 | Python | 递归 | 中等 |
0801 | 使序列递增的最小交换次数 | Python | 动态规划 | 中等 |
0836 | 矩形重叠 | Python | 数学 | 简单 |
0841 | 钥匙和房间 | Python | 深度优先搜索、图 | 中等 |
0867 | 转置矩阵 | Python | 数组 | 简单 |
0876 | 链表的中间结点 | Python | 链表、指针 | 简单 |
0918 | 环形子数组的最大和 | Python | 数组、动态规划 | 中等 |
0938 | 二叉搜索树的范围和 | Python | 二叉树 | 简单 |
0993 | 二叉树的堂兄弟节点 | Python | 树、广度优先搜索 | 简单 |
1004 | 最大连续1的个数 III | Python | 双指针、滑动窗口 | 中等 |
1011 | 在 D 天内送达包裹的能力 | Python | 数组、二分查找 | 中等 |
1047 | 删除字符串中的所有相邻重复项 | Python | 字符串、栈 | 简单 |
1227 | 飞机座位分配概率 | Python | 数学、动态规划 | 中等 |
1232 | 缀点成线 | Python | 几何、数组、数学 | 简单 |
1480 | 一维数组的动态和 | Python | 数组 | 简单 |
1486 | 数组异或操作 | Python | 位运算、数组 | 简单 |
1720 | 解码异或后的数组 | Python | 位运算 | 简单 |