leetcode
leetcode copied to clipboard
LeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解,记录自己的leetcode解题之路。)
LeetCode
简体中文 | English
我们的 slogan 是: 只有熟练掌握基础的数据结构与算法,才能对复杂问题迎刃有余。
🔥🔥🔥 我的《算法通关之路》出版了 🔥🔥🔥
我的新书《算法通关之路》出版了。
:blue_book: 电子书
注意:这里的电子书并不是《算法通关之路》的电子版,而是本仓库内容的电子版!
限时免费下载!后期随时可能收费
可以去我的公众号《力扣加加》后台回复电子书获取!
epub 还是有动图的
另外有些内容只在公众号发布,因此大家觉得内容不错的话,可以关注一下。如果再给 ➕ 个星标就更棒啦!
图片加载不出来如何解决?
https://github.com/fe-lucifer/fanqiang
九章算法班
九章算法,由北大、清华校友于美国硅谷创办,已帮助数十万 IT 程序员找到高薪 offer! 提供 1 对 1 求职指导、算法指导、前后端项目、简历代笔等服务。
-
推荐刷题网站:www.lintcode.com, 戳此免费领取 7 天LintCode 超级 Vip
-
推荐北大 FB 双料大神的《九章算法班》,有人靠他连拿 3 个大厂 offer
:calendar:《91 天学算法》限时活动
很多教育机构宣传的 7 天,一个月搞定算法面试的,我大概都了解了下,不怎么靠谱。学习算法这东西,还是要靠积累,没有量变是不可能有质变的。还有的人选择看书,这是一个不错的选择。但是很多人选了过时的或者质量差的书,又或者不会去写书中给的练习题,导致效果很差。
基于这几个原因,我组织了一个 91 天刷题活动,通过一个相对比较长的时间(91 天)给出最新的学习路径,并强制大家打卡这种高强度练习来让大家在 91 天后遇见更好的自己。详细活动介绍可以点下方链接查看。另外往期的讲义也在下面了,大家可以看看合不合你的口味。
最后送给大家一句话: 坚持下去,会有突然间成长的一天。
- 🔥🔥🔥🔥 活动首页 🔥🔥🔥🔥
- 91 第三期讲义 - 二分专题(上)
- 91 第三期讲义 - 二分专题(下)
:octocat: 仓库介绍
leetcode 题解,记录自己的 leetcode 解题之路。
本仓库目前分为五个部分:
-
第一个部分是 leetcode 经典题目的解析,包括思路,关键点和具体的代码实现。
-
第二部分是对于数据结构与算法的总结
-
第三部分是 anki 卡片, 将 leetcode 题目按照一定的方式记录在 anki 中,方便大家记忆。
-
第四部分是每日一题,每日一题是在交流群(包括微信和 qq)里进行的一种活动,大家一起 解一道题,这样讨论问题更加集中,会得到更多的反馈。而且 这些题目可以被记录下来,日后会进行筛选添加到仓库的题解模块。
-
第五部分是计划, 这里会记录将来要加入到以上三个部分内容
:meat_on_bone: 仓库食用指南
- 这里有一张互联网公司面试中经常考察的问题类型总结的思维导图,我们可以结合图片中的信息分析一下。
(图片来自 leetcode)
其中算法,主要是以下几种:
- 基础技巧:分治、二分、贪心
- 排序算法:快速排序、归并排序、计数排序
- 搜索算法:回溯、递归、深度优先遍历,广度优先遍历,二叉搜索树等
- 图论:最短路径、最小生成树
- 动态规划:背包问题、最长子序列
数据结构,主要有如下几种:
- 数组与链表:单 / 双向链表
- 栈与队列
- 哈希表
- 堆:最大堆 / 最小堆
- 树与图:最近公共祖先、并查集
- 字符串:前缀树(字典树) / 后缀树
我在网上找到一份 《Interview Cheat Sheet》,这个 PDF 列举了面试的模板步骤。,详细指示了如何一步步完成面试。
这个 pdf 开头就提到了好的代码三个标准:
- 可读性
- 时间复杂度
- 空间复杂度
这写的太好了。
紧接着,列举了 15 算法面试的步骤。比如步骤一:当面试官提问完后,你需要先下来关键点(之后再下面写注释和代码) 看完我的感受就是,面试只要按照这个来做,成功率蹭蹭提升
数据结构与算法的总结
- 数据结构总览
- 链表专题
- 树专题
- 堆专题(上)
- 堆专题(下)
- 二分专题(上)
- 二分专题(下)
- 动态规划(重置版)
- 大话搜索
- 二叉树的遍历
- 回溯
- 哈夫曼编码和游程编码
- 布隆过滤器🖊
- 前缀树🖊
- 《日程安排》专题
- 《构造二叉树》专题
- 滑动窗口(思路 + 模板)
- 位运算
- 小岛问题🖊
- 最大公约数
- 并查集
- 平衡二叉树专题
- 蓄水池抽样
- 单调栈
:exclamation: 怎么刷 LeetCode?
:computer: 插件
或许是一个可以改变你刷题效率的浏览器扩展插件。
不能访问谷歌商店的朋友可以去我的公众号回复插件获取离线版。强烈推荐大家使用谷歌商店安装, 这样如果有更新可以自动安装,毕竟咱们的插件更新还是蛮快的。
另外大家也可以使用 zerotrac 开发的用于计算力扣中题目分数的网站。这里的分数指的是竞赛分,大家可以根据自己的竞赛分选择稍微比自己竞赛分高一点的题目进行练习,注意这个只是根据通过人数等计算的一个预估分数。地址:https://zerotrac.github.io/leetcode_problem_rating/
精选题解
- 字典序列删除
- 一次搞定前缀和
- 字节跳动的算法面试题是什么难度?
- 字节跳动的算法面试题是什么难度?(第二弹)
- 《我是你的妈妈呀》 - 第一期
- 一文带你看懂二叉树的序列化
- 穿上衣服我就不认识你了?来聊聊最长上升子序列
- 你的衣服我扒了 - 《最长公共子序列》
- 一文看懂《最大子序列和问题》
leetcode 经典题目的解析(200 多道)
这里仅列举具有代表性题目,并不是全部题目
目前更新了 200 多道题解,加上专题涉及的题目,差不多有 300 道。
简单难度题目合集
这里的题目难度比较小, 大多是模拟题,或者是很容易看出解法的题目,另外简单题目一般使用暴力法都是可以解决的。 这个时候只有看一下数据范围,思考下你的算法复杂度就行了。
当然也不排除很多 hard 题目也可以暴力模拟,大家平时多注意数据范围即可。
以下是我列举的经典题目(带 91 字样的表示出自 91 天学算法活动):
-
面试题 17.12. BiNode 👍
-
0001. 两数之和
-
0020. 有效的括号
-
0021. 合并两个有序链表
-
0026. 删除排序数组中的重复项
-
0053. 最大子序和
-
0066. 加一 91
-
0088. 合并两个有序数组
-
0101. 对称二叉树
-
0104. 二叉树的最大深度
-
0108. 将有序数组转换为二叉搜索树
-
0121. 买卖股票的最佳时机
-
0122. 买卖股票的最佳时机 II
-
0125. 验证回文串
-
0136. 只出现一次的数字
-
0155. 最小栈 👍
-
0160. 相交链表 91
-
0167. 两数之和 II 输入有序数组
-
0169. 多数元素
-
0172. 阶乘后的零
-
0190. 颠倒二进制位
-
0191. 位 1 的个数
-
0198. 打家劫舍
-
0203. 移除链表元素
-
0206. 反转链表
-
0219. 存在重复元素 II
-
0226. 翻转二叉树
-
0232. 用栈实现队列 👍 91
-
0263. 丑数
-
0283. 移动零
-
0342. 4 的幂 👍
-
0349. 两个数组的交集
-
0371. 两整数之和
-
401. 二进制手表
-
0437. 路径总和 III
-
0455. 分发饼干
-
0504. 七进制数
-
0575. 分糖果
-
0606. 根据二叉树创建字符串
-
0661. 图片平滑器
-
0665. 非递减数列
-
821. 字符的最短距离 91
-
0874. 模拟行走机器人
-
1128. 等价多米诺骨牌对的数量
-
1260. 二维网格迁移
-
1332. 删除回文子序列
中等难度题目合集
中等题目是力扣比例最大的部分,因此这部分我的题解也是最多的。 大家不要太过追求难题,先把中等难度题目做熟了再说。
这部分的题目要不需要我们挖掘题目的内含信息, 将其抽象成简单题目。 要么是一些写起来比较麻烦的题目, 一些人编码能力不行就挂了。因此大家一定要自己做, 即使看了题解 ”会了“,也要自己码一遍。自己不亲自写一遍,里面的细节永远不知道。
以下是我列举的经典题目(带 91 字样的表示出自 91 天学算法活动):
-
面试题 17.09. 第 k 个数
-
面试题 17.23. 最大黑方阵
-
面试题 16.16. 部分排序
-
Increasing Digits 👍
-
Longest Contiguously Strictly Increasing Sublist After Deletion 👍
-
Consecutive Wins
-
Sort-String-by-Flipping
-
Number of Substrings with Single Character Difference
-
Bus Fare 👍
-
Minimum Dropping Path Sum
-
Longest-Matrix-Path-Length
-
Every Sublist Min Sum
-
Maximize the Number of Equivalent Pairs After Swaps
-
0002. 两数相加
-
0003. 无重复字符的最长子串
-
0005. 最长回文子串
-
0011. 盛最多水的容器
-
0015. 三数之和
-
0017. 电话号码的字母组合
-
0019. 删除链表的倒数第 N 个节点
-
0022. 括号生成
-
0024. 两两交换链表中的节点
-
0029. 两数相除
-
0031. 下一个排列
-
0033. 搜索旋转排序数组
-
0039. 组合总和
-
0040. 组合总和 II
-
0046. 全排列
-
0047. 全排列 II
-
0048. 旋转图像
-
0049. 字母异位词分组
-
0050. Pow(x, n) 👍
-
0055. 跳跃游戏
-
0056. 合并区间
-
0060. 第 k 个排列 👍
-
0061. 旋转链表 91
-
0062. 不同路径
-
0073. 矩阵置零
-
0075. 颜色分类 👍
-
0078. 子集
-
0079. 单词搜索
-
0080. 删除排序数组中的重复项 II
-
0086. 分隔链表
-
0090. 子集 II
-
0091. 解码方法
-
0092. 反转链表 II
-
0094. 二叉树的中序遍历 👍
-
0095. 不同的二叉搜索树 II
-
0096. 不同的二叉搜索树
-
0098. 验证二叉搜索树
-
0102. 二叉树的层序遍历
-
0103. 二叉树的锯齿形层次遍历
-
0113. 路径总和 II
-
0129. 求根到叶子节点数字之和 👍
-
0130. 被围绕的区域
-
0131. 分割回文串
-
0139. 单词拆分
-
0144. 二叉树的前序遍历
-
0147. 对链表进行插入排序
-
0150. 逆波兰表达式求值
-
0152. 乘积最大子数组
-
0153. 寻找旋转排序数组中的最小值
-
0199. 二叉树的右视图 👍
-
0200. 岛屿数量 👍
-
0201. 数字范围按位与
-
0208. 实现 Trie (前缀树)
-
0209. 长度最小的子数组
-
0211. 添加与搜索单词 - 数据结构设计
-
0215. 数组中的第 K 个最大元素
-
0220. 存在重复元素 III
-
0221. 最大正方形
-
0227. 基本计算器 II
-
0229. 求众数 II
-
0230. 二叉搜索树中第 K 小的元素
-
0236. 二叉树的最近公共祖先
-
0238. 除自身以外数组的乘积
-
0240. 搜索二维矩阵 II
-
0279. 完全平方数
-
0309. 最佳买卖股票时机含冷冻期
-
0322. 零钱兑换 👍
-
0324. 摆动排序 II
-
0328. 奇偶链表
-
0331. 验证二叉树的前序序列化
-
0334. 递增的三元子序列
-
0337. 打家劫舍 III
-
0343. 整数拆分
-
0365. 水壶问题
-
0378. 有序矩阵中第 K 小的元素
-
0380. 常数时间插入、删除和获取随机元素
-
0385. 迷你语法分析器
-
0394. 字符串解码 91
-
0416. 分割等和子集
-
0424. 替换后的最长重复字符
-
0438. 找到字符串中所有字母异位词
-
0445. 两数相加 II
-
0454. 四数相加 II
-
0456. 132 模式
-
0457.457. 环形数组是否存在循环
-
0464. 我能赢么
-
0470. 用 Rand7() 实现 Rand10
-
0473. 火柴拼正方形 👍
-
0494. 目标和
-
0516. 最长回文子序列
-
0513. 找树左下角的值 91
-
0518. 零钱兑换 II
-
0525. 连续数组
-
0547. 省份数量
-
0560. 和为 K 的子数组
-
0609. 在系统中查找重复文件
-
0611. 有效三角形的个数 👍
-
0673. 最长递增子序列的个数
-
0686. 重复叠加字符串匹配
-
0710. 黑名单中的随机数
-
0714. 买卖股票的最佳时机含手续费
-
0718. 最长重复子数组
-
0735. 行星碰撞 👍
-
0754. 到达终点数字
-
0785. 判断二分图
-
0790. 多米诺和托米诺平铺
-
0799. 香槟塔
-
0801. 使序列递增的最小交换次数
-
0816. 模糊坐标
-
0820. 单词的压缩编码
-
0838. 推多米诺
-
0873. 最长的斐波那契子序列的长度
-
0875. 爱吃香蕉的珂珂
-
0877. 石子游戏
-
0886. 可能的二分法
-
0898. 子数组按位或操作
-
0900. RLE 迭代器
-
0911. 在线选举
-
0912. 排序数组
-
0932. 漂亮数组
-
0935. 骑士拨号器
-
0947. 移除最多的同行或同列石头
-
0959. 由斜杠划分区域
-
0978. 最长湍流子数组
-
0987. 二叉树的垂序遍历 91
-
1004. 最大连续 1 的个数 III
-
1011. 在 D 天内送达包裹的能力
-
1014. 最佳观光组合
-
1015. 可被 K 整除的最小整数
-
1019. 链表中的下一个更大节点
-
1020. 飞地的数量
-
1023. 驼峰式匹配
-
1031. 两个非重叠子数组的最大和
-
1043. 分隔数组以得到最大和
-
1104. 二叉树寻路
-
1129. 颜色交替的最短路径
-
1131. 绝对值表达式的最大值
-
1138. 字母板上的路径
-
1186. 删除一次得到子数组最大和
-
1218. 最长定差子序列
-
1227. 飞机座位分配概率 👍
-
1261. 在受污染的二叉树中查找元素
-
1262. 可被三整除的最大和
-
1297. 子串的最大出现次数
-
1310. 子数组异或查询
-
1334. 阈值距离内邻居最少的城市
-
1371. 每个元音包含偶数次的最长子字符串
-
1381. 设计一个支持增量操作的栈 91
-
1423. 可获得的最大点数
-
1438. 绝对差不超过限制的最长连续子数组
-
1558. 得到目标数组的最少函数调用次数
-
1574. 删除最短的子数组使剩余数组有序
-
1589. 所有排列中的最大和
-
1631. 最小体力消耗路径
-
1658. 将 x 减到 0 的最小操作数
-
1697. 检查边长度限制的路径是否存在
-
1737. 满足三条件之一需改变的最少字符数 👍
-
1770. 执行乘法运算的最大分数 👍 91
-
1834. 单线程 CPU
-
1899. 合并若干三元组以形成目标三元组 👍
-
1904. 你完成的完整对局数
-
1906. 查询差绝对值的最小值
-
2007. 从双倍数组中还原原数组
-
2008. 出租车的最大盈利
-
5935. 适合打劫银行的日子
-
5936. 引爆最多的炸弹
-
5965. 相同元素的间隔之和
-
6021. 字符串中最多数目的子字符串
困难难度题目合集
困难难度题目从类型上说多是:
- 图
- 设计题
- 游戏场景题目
- 中等题目的 follow up
从解法上来说,多是:
- 图算法
- 动态规划
- 二分法
- DFS & BFS
- 状态压缩
- 剪枝
从逻辑上说, 要么就是非常难想到,要么就是非常难写代码。 这里我总结了几个技巧:
- 看题目的数据范围, 看能否暴力模拟
- 暴力枚举所有可能的算法往上套,比如图的题目。
- 总结和记忆解题模板,减少解题压力
以下是我列举的经典题目(带 91 字样的表示出自 91 天学算法活动):
-
LCP 20. 快速公交
-
LCP 21. 追逐游戏 👍
-
Number Stream to Intervals
-
Triple Inversion 91
-
Kth Pair Distance 91
-
Minimum Light Radius 91
-
Largest Equivalent Set of Pairs 👍
-
Ticket-Order.md
-
Connected-Road-to-Destination
-
0004. 寻找两个正序数组的中位数 👍
-
0023. 合并 K 个升序链表
-
0025. K 个一组翻转链表 👍
-
0030. 串联所有单词的子串
-
0032. 最长有效括号
-
0042. 接雨水
-
0052. N 皇后 II
-
0057. 插入区间
-
0065. 有效数字
-
0084. 柱状图中最大的矩形
-
0085. 最大矩形
-
0087. 扰乱字符串
-
0124. 二叉树中的最大路径和
-
0128. 最长连续序列
-
0132. 分割回文串 II 👍
-
0140. 单词拆分 II
-
0145. 二叉树的后序遍历
-
0146. LRU 缓存机制
-
0154. 寻找旋转排序数组中的最小值 II
-
0212. 单词搜索 II
-
0239. 滑动窗口最大值 👍
-
0295. 数据流的中位数
-
0297. 二叉树的序列化与反序列化 91
-
0301. 删除无效的括号
-
0312. 戳气球
-
330. 按要求补齐数组
-
0335. 路径交叉
-
0460. LFU 缓存
-
0472. 连接词
-
0480. 滑动窗口中位数
-
0483. 最小好进制
-
0488. 祖玛游戏
-
0493. 翻转对
-
0664. 奇怪的打印机
-
0679. 24 点游戏
-
0715. Range 模块 👍
-
0726. 原子的数量
-
0768. 最多能完成排序的块 II 91
-
0805. 数组的均值分割
-
0839. 相似字符串组
-
0887. 鸡蛋掉落
-
0895. 最大频率栈
-
0909. 蛇梯棋
-
0975. 奇偶跳
-
0995. K 连续位的最小翻转次数
-
1032. 字符流
-
1168. 水资源分配优化
-
1178. 猜字谜
-
1203. 项目管理
-
1255. 得分最高的单词集合
-
1345. 跳跃游戏 IV
-
1449. 数位成本和为目标值的最大数字
-
1494. 并行课程 II
-
1521. 找到最接近目标值的函数值
-
1526. 形成目标数组的子数组最少增加次数
-
1649. 通过指令创建有序数组
-
1671. 得到山形数组的最少删除次数
-
1707. 与数组中元素的最大异或值
-
1713. 得到子序列的最少操作次数
-
1723. 完成所有工作的最短时间
-
1787. 使所有区间的异或结果为零
-
1835. 所有数对按位与结果的异或和
-
1871. 跳跃游戏 VII 👍
-
1872. 石子游戏 VIII
-
1883. 准时抵达会议现场的最小跳过休息次数
-
1970. 你能穿过矩阵的最后一天
-
2009. 使数组连续的最少操作数
-
2025. 分割数组的最多方案数
-
2030. 含特定字母的最小子序列
-
2102. 序列顺序查询
-
2209. 用地毯覆盖后的最少白色砖块 👍
-
2281. 巫师的总力量和
-
2306. 公司命名 枚举优化好题
-
5254. 卖木头块 动态规划经典题
-
5999. 统计数组中好三元组数目 👍
:trident: anki 卡片
Anki 主要分为两个部分:一部分是关键点到题目的映射,另一部分是题目到思路,关键点,代码的映射。
全部卡片都在 anki-card
使用方法:
anki - 文件 - 导入 - 下拉格式选择“打包的 anki 集合”,然后选中你下载好的文件,确定即可。
更多关于 anki 使用方法的请查看 anki 官网
关于我
大家也可以加我微信好友进行交流!
:chart_with_upwards_trend: 大事件
-
2019-07-10 :纪念项目 Star 突破 1W 的一个短文, 记录了项目的"兴起"之路,大家有兴趣可以看一下,如果对这个项目感兴趣,请点击一下 Star, 项目会持续更新,感谢大家的支持。
-
2019-10-08: 纪念 LeetCode 项目 Star 突破 2W,并且 Github 搜索“LeetCode”,排名第一。
-
2020-04-12: 项目突破三万 Star。
-
2020-04-14: 官网
力扣加加
上线啦 💐💐💐💐💐,有专题讲解,每日一题,下载区和视频题解,后续会增加更多内容,还不赶紧收藏起来?地址:http://leetcode-solution.cn/
- 2021-02-23: star 破四万
:gift_heart: 贡献
- 如果有想法和创意,请提 issue 或者进群提
- 如果想贡献增加题解或者翻译, 可以参考 贡献指南
关于如何提交题解,我写了一份 指南
- 如果需要修改项目中图片,这里 存放了项目中绘制图的源代码,大家可以用 draw.io 打开进行编辑。
:love_letter: 鸣谢
感谢为这个项目作出贡献的所有 小伙伴
License
CC BY-NC-ND 4.0