diff --git a/.gitignore b/.gitignore index 4b64967..4069360 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ __pycache__ -.vscode .DS_Store +.vscode +*.xlsx diff --git a/README.md b/README.md index de7f97e..5258c3d 100755 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -

+

-

+

@@ -13,39 +13,51 @@ [《图解算法数据结构》](https://leetcode-cn.com/leetbook/detail/illustration-of-algorithm/)是一本面向算法初学者和互联网求职者编写的 LeetBook 手册。 -- 图文详解 75 道题目,覆盖主要算法知识点,非常适合作为算法学习的第一份题库。 +- 图文详解 75 道题目,覆盖主要算法知识点。 - 题目活跃于各大互联网公司招聘中,可使笔面试准备事半功倍。 - 致力于行文深入浅出、图文搭配,提供简洁的 Python, Java, C++ 解题代码。 > 若本 LeetBook 对您有所帮助,请在页面右上角点个 Star :star: 支持一下,谢谢! +本仓库包含“图解算法数据结构”、“Krahets 笔面试精选 88 题”和“剑指 Offer”的题解内容,所有代码皆可一键运行: + +```shell +LeetCode-Book +├── leetbook_ioa # 《图解算法数据结构》题解和专栏文档、代码 +├── selected_coding_interview # 「Krahets 笔面试精选 88 题」题解文档、代码 +└── sword_for_offer # 《剑指 Offer》题解文档、代码、刷题计划 +``` + ## 如何入门算法? ### 第一步:看入门书 -

- +

+

-

- 《Hello 算法》:动画图解、一键运行的数据结构与算法教程 -

+[《Hello 算法》](https://github.com/krahets/hello-algo):动画图解、一键运行的数据结构与算法教程。 -

- - 前往仓库 > - -     - - 在线阅读 > - -

+这本书旨在引导初学者探索数据结构与算法的知识地图,掌握完整的刷题工具库。 ### 第二步:刷算法题 -1. [Krahets 笔面试精选 88 题](https://leetcode.cn/studyplan/selected-coding-interview/):由“剑指 Offer”和“Hot 100”组成的高频面试题单。 -2. [图解算法数据结构](https://leetcode-cn.com/leetbook/detail/illustration-of-algorithm/)或[Interview-75](https://leetcode.cn/studyplan/coding-interviews/):题目更贴近实际应用,相对“剑指 Offer”难度有所增加。 +推荐以下 LeetCode 题单(前两项 [@Krahets](https://leetcode.cn/u/jyd/) 题解全覆盖): + +1. [Krahets 笔面试精选 88 题](https://leetcode.cn/studyplan/selected-coding-interview/):从“剑指 Offer”和“热题 100”精选出的 88 道高频算法笔试题。 +2. [图解算法数据结构](https://leetcode-cn.com/leetbook/detail/illustration-of-algorithm/)([Interview-75](https://leetcode.cn/studyplan/coding-interviews/)):题目更贴近实际应用,相对“剑指 Offer”难度有所增加。 +3. [LeetCode 热题 100](https://leetcode.cn/studyplan/top-100-liked/):力扣用户最喜爱的 100 道题。 +4. [面试经典 150 题](https://leetcode.cn/studyplan/top-interview-150/):150 道经典面试力扣题。 +5. [LeetCode-75](https://leetcode.cn/studyplan/leetcode-75/):精选面试必备的 75 道核心题目。 + +对初学者的刷题建议: + +1. 建议每日刷 2~3 题。若能轻松完成,可以尝试增加至 5~8 题。请注意,刷题的质量远重要于数量。务必确保你真正理解了每个题目的解法及背后的算法原理。 +2. 建议你按照目录顺序逐题解答。如果碰到某些难以解决的题目,可以先跳过,稍后回顾时再挑战。 +3. 很多题目都有不止一种解法,请你注意比较和探讨各种方法的特点和适用情况。 +4. 如果你发现自己忘记了某个题目的解法,不必灰心。艾宾浩斯遗忘曲线指出,通常需要复习至少三次,才能真正掌握一个知识点。 +5. 行百里者半九十。坚持至关重要,加油,相信你可以做到! ## License diff --git "a/sword_for_offer/\345\211\221\346\214\207 Offer \345\210\267\351\242\230\350\256\241\345\210\222.md" "b/sword_for_offer/\345\211\221\346\214\207 Offer \345\210\267\351\242\230\350\256\241\345\210\222.md" new file mode 100755 index 0000000..5f112ff --- /dev/null +++ "b/sword_for_offer/\345\211\221\346\214\207 Offer \345\210\267\351\242\230\350\256\241\345\210\222.md" @@ -0,0 +1,119 @@ +# 剑指 Offer 刷题计划 + +剑指 Offer 系列题目非常适合作为算法入门题目集,尤其适合有互联网求职需求的同学们,能够让我们全面练习,快速搭建起算法与数据结构的知识框架。 + +- 算法: 动态规划、回溯算法、查找算法、搜索算法、贪心算法、分治算法、位运算、双指针、排序、模拟、数学、…… +- 数据结构: 数组、栈、队列、字符串、链表、树、图、堆、哈希表、…… + +笔者整理了本刷题计划,核心理念为从易到难、从基础类题目到综合类题目,供希望按照知识点类型顺序刷题的小伙伴们参考。 + +> 行百里者半九十。坚持一个月刷完,一起加油! + +| 日程 | 题目 | +| :--------: | :-------------------------------------------- | +| **Day 1** | **栈与队列(简单)** | +| | 剑指 Offer 09. 用两个栈实现队列 | +| | 剑指 Offer 30. 包含 min 函数的栈 | +| **Day 2** | **链表(简单)** | +| | 剑指 Offer 06. 从尾到头打印链表 | +| | 剑指 Offer 24. 反转链表 | +| | 剑指 Offer 35. 复杂链表的复制 | +| **Day 3** | **字符串(简单)** | +| | 剑指 Offer 05. 替换空格 | +| | 剑指 Offer 58 - II. 左旋转字符串 | +| **Day 4** | **查找算法(简单)** | +| | 剑指 Offer 03. 数组中重复的数字 | +| | 剑指 Offer 53 - I. 在排序数组中查找数字 I | +| | 剑指 Offer 53 - II. 0~n-1 中缺失的数字 | +| **Day 5** | **查找算法(中等)** | +| | 剑指 Offer 04. 二维数组中的查找 | +| | 剑指 Offer 11. 旋转数组的最小数字 | +| | 剑指 Offer 50. 第一个只出现一次的字符 | +| **Day 6** | **搜索与回溯算法(简单)** | +| | 剑指 Offer 32 - I. 从上到下打印二叉树 | +| | 剑指 Offer 32 - II. 从上到下打印二叉树 II | +| | 剑指 Offer 32 - III. 从上到下打印二叉树 III | +| **Day 7** | **搜索与回溯算法(简单)** | +| | 剑指 Offer 26. 树的子结构 | +| | 剑指 Offer 27. 二叉树的镜像 | +| | 剑指 Offer 28. 对称的二叉树 | +| **Day 8** | **动态规划(简单)** | +| | 剑指 Offer 10- I. 斐波那契数列 | +| | 剑指 Offer 10- II. 青蛙跳台阶问题 | +| | 剑指 Offer 63. 股票的最大利润 | +| **Day 9** | **动态规划(中等)** | +| | 剑指 Offer 42. 连续子数组的最大和 | +| | 剑指 Offer 47. 礼物的最大价值 | +| **Day 10** | **动态规划(中等)** | +| | 剑指 Offer 46. 把数字翻译成字符串 | +| | 剑指 Offer 48. 最长不含重复字符的子字符串 | +| **Day 11** | **双指针(简单)** | +| | 剑指 Offer 18. 删除链表的节点 | +| | 剑指 Offer 22. 链表中倒数第 k 个节点 | +| **Day 12** | **双指针(简单)** | +| | 剑指 Offer 25. 合并两个排序的链表 | +| | 剑指 Offer 52. 两个链表的第一个公共节点 | +| **Day 13** | **双指针(简单)** | +| | 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 | +| | 剑指 Offer 57. 和为 s 的两个数字 | +| | 剑指 Offer 58 - I. 翻转单词顺序 | +| **Day 14** | **搜索与回溯算法(中等)** | +| | 剑指 Offer 12. 矩阵中的路径 | +| | 剑指 Offer 13. 机器人的运动范围 | +| **Day 15** | **搜索与回溯算法(中等)** | +| | 剑指 Offer 34. 二叉树中和为某一值的路径 | +| | 剑指 Offer 36. 二叉搜索树与双向链表 | +| | 剑指 Offer 54. 二叉搜索树的第 k 大节点 | +| **Day 16** | **排序(简单)** | +| | 剑指 Offer 45. 把数组排成最小的数 | +| | 剑指 Offer 61. 扑克牌中的顺子 | +| **Day 17** | **排序(中等)** | +| | 剑指 Offer 40. 最小的 k 个数 | +| | 剑指 Offer 41. 数据流中的中位数 | +| **Day 18** | **搜索与回溯算法(中等)** | +| | 剑指 Offer 55 - I. 二叉树的深度 | +| | 剑指 Offer 55 - II. 平衡二叉树 | +| **Day 19** | **搜索与回溯算法(中等)** | +| | 剑指 Offer 64. 求 1 + 2 + … + n | +| | 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 | +| | 剑指 Offer 68 - II. 二叉树的最近公共祖先 | +| **Day 20** | **分治算法(中等)** | +| | 剑指 Offer 07. 重建二叉树 | +| | 剑指 Offer 16. 数值的整数次方 | +| | 剑指 Offer 33. 二叉搜索树的后序遍历序列 | +| **Day 21** | **位运算(简单)** | +| | 剑指 Offer 15. 二进制中 1 的个数 | +| | 剑指 Offer 65. 不用加减乘除做加法 | +| **Day 22** | **位运算(中等)** | +| | 剑指 Offer 56 - I. 数组中数字出现的次数 | +| | 剑指 Offer 56 - II. 数组中数字出现的次数 II | +| **Day 23** | **数学(简单)** | +| | 剑指 Offer 39. 数组中出现次数超过一半的数字 | +| | 剑指 Offer 66. 构建乘积数组 | +| **Day 24** | **数学(中等)** | +| | 剑指 Offer 14- I. 剪绳子 | +| | 剑指 Offer 57 - II. 和为 s 的连续正数序列 | +| | 剑指 Offer 62. 圆圈中最后剩下的数字 | +| **Day 25** | **模拟(中等)** | +| | 剑指 Offer 29. 顺时针打印矩阵 | +| | 剑指 Offer 31. 栈的压入、弹出序列 | +| **Day 26** | **字符串(中等)** | +| | 剑指 Offer 20. 表示数值的字符串 | +| | 剑指 Offer 67. 把字符串转换成整数 | +| **Day 27** | **栈与队列(困难)** | +| | 剑指 Offer 59 - I. 滑动窗口的最大值 | +| | 剑指 Offer 59 - II. 队列的最大值 | +| **Day 28** | **搜索与回溯算法(困难)** | +| | 剑指 Offer 37. 序列化二叉树 | +| | 剑指 Offer 38. 字符串的排列 | +| **Day 29** | **动态规划(困难)** | +| | 剑指 Offer 19. 正则表达式匹配 | +| | 剑指 Offer 49. 丑数 | +| | 剑指 Offer 60. n 个骰子的点数 | +| **Day 30** | **分治算法(困难)** | +| | 剑指 Offer 17. 打印从 1 到最大的 n 位数 | +| | 剑指 Offer 51. 数组中的逆序对 | +| **Day 31** | **数学(困难)** | +| | 剑指 Offer 14- II. 剪绳子 II | +| | 剑指 Offer 43. 1~n 整数中 1 出现的次数 | +| | 剑指 Offer 44. 数字序列中某一位的数字 | diff --git "a/sword_for_offer/\345\211\221\346\214\207 Offer \351\242\230\347\233\256\345\210\206\347\261\273.md" "b/sword_for_offer/\345\211\221\346\214\207 Offer \351\242\230\347\233\256\345\210\206\347\261\273.md" new file mode 100755 index 0000000..31c0b21 --- /dev/null +++ "b/sword_for_offer/\345\211\221\346\214\207 Offer \351\242\230\347\233\256\345\210\206\347\261\273.md" @@ -0,0 +1,81 @@ +# 剑指 Offer 题目分类 + +下表划分了各题使用的算法与数据结构。由于题目可能存在多种解法,本表格只列举最优解法(时间与空间复杂度最低)的对应算法。 + +| 题目 | 算法分类 | 数据结构分类 | +| ---------------------------------- | ------------------------ | --------------- | +| 03. 数组中重复的数字 | 查找算法 | 数组 | +| 04. 二维数组中的查找 | 查找算法 | 数组 | +| 05. 替换空格 | | 字符串 | +| 06. 从尾到头打印链表 | | 栈 / 队列,链表 | +| 07. 重建二叉树 | 分治算法 | 树,哈希表 | +| 09. 用两个栈实现队列 | | 栈 / 队列 | +| 10-I. 斐波那契数列 | 动态规划 | | +| 10-II. 青蛙跳台阶问题 | 动态规划 | | +| 11. 旋转数组的最小数字 | 查找算法 | 数组 | +| 12. 矩阵中的路径 | 回溯算法,搜索算法 | 数组,图 | +| 13. 机器人的运动范围 | 回溯算法,搜索算法 | 数组,图 | +| 14-I. 剪绳子 | 贪心算法,数学 | | +| 14- II. 剪绳子 II | 贪心算法,分治算法,数学 | | +| 15. 二进制中 1 的个数 | 位运算 | | +| 16. 数值的整数次方 | 分治算法,位运算 | | +| 17. 打印从 1 到最大的 n 位数 | | 数组 | +| 18. 删除链表的节点 | 双指针 | 链表 | +| 19. 正则表达式匹配 | 动态规划 | 字符串 | +| 20. 表示数值的字符串 | | 字符串 | +| 21. 调整数组顺序使奇数位于偶数前面 | 双指针 | 数组 | +| 22. 链表中倒数第 k 个节点 | 双指针 | 链表 | +| 24. 反转链表 | 双指针 | 链表 | +| 25. 合并两个排序的链表 | 双指针 | 链表 | +| 26. 树的子结构 | 搜索算法 | 树 | +| 27. 二叉树的镜像 | 搜索算法 | 栈 / 队列,树 | +| 28. 对称的二叉树 | 搜索算法 | 树 | +| 29. 顺时针打印矩阵 | 模拟 | 数组 | +| 30. 包含 min 函数的栈 | 排序 | 栈 / 队列 | +| 31. 栈的压入、弹出序列 | 模拟 | 栈 / 队列 | +| 32-I. 从上到下打印二叉树 | 搜索算法 | 栈 / 队列,树 | +| 32-II. 从上到下打印二叉树 II | 搜索算法 | 栈 / 队列,树 | +| 32-III. 从上到下打印二叉树 III | 搜索算法 | 栈 / 队列,树 | +| 33. 二叉搜索树的后序遍历序列 | 分治算法 | 栈 / 队列,树 | +| 34. 二叉树中和为某一值的路径 | 回溯算法,搜索算法 | 树 | +| 35. 复杂链表的复制 | | 链表 | +| 36. 二叉搜索树与双向链表 | 搜索算法,双指针 | 树 | +| 37. 序列化二叉树 | 搜索算法 | 树 | +| 38. 字符串的排列 | 回溯算法 | 字符串,哈希表 | +| 39. 数组中出现次数超过一半的数字 | | 数组 | +| 40. 最小的 k 个数 | 排序 | 数组,堆 | +| 41. 数据流中的中位数 | 排序 | 堆 | +| 42. 连续子数组的最大和 | 动态规划 | 数组 | +| 43. 1 ~ n整数中 1 出现的次数 | 数学 | | +| 44. 数字序列中某一位的数字 | 数学 | | +| 45. 把数组排成最小的数 | 排序 | 字符串 | +| 46. 把数字翻译成字符串 | 动态规划 | 字符串 | +| 47. 礼物的最大价值 | 动态规划 | 数组 | +| 48. 最长不含重复字符的子字符串 | 动态规划,双指针 | 哈希表 | +| 49. 丑数 | 动态规划 | | +| 50. 第一个只出现一次的字符 | | 哈希表 | +| 51. 数组中的逆序对 | 分治算法 | 数组 | +| 52. 两个链表的第一个公共节点 | 双指针 | 链表 | +| 53-I. 在排序数组中查找数字 I | 查找算法 | 数组 | +| 53-II. 0 ~ n - 1 中缺失的数字 | 查找算法 | 数组 | +| 54. 二叉搜索树的第 k 大节点 | 搜索算法 | 树 | +| 55-I. 二叉树的深度 | 搜索算法 | 树 | +| 55-II. 平衡二叉树 | 搜索算法 | 树 | +| 56-I. 数组中数字出现的次数 | 位运算 | 数组 | +| 56-II. 数组中数字出现的次数 II | 位运算 | 数组 | +| 57. 和为 s 的两个数字 | 双指针 | 数组 | +| 57-II. 和为 s 的连续正数序列 | 双指针 | 数组 | +| 58-I. 翻转单词顺序 | 双指针 | 字符串 | +| 58-II. 左旋转字符串 | | 字符串 | +| 59-I. 滑动窗口的最大值 | 排序 | 数组,栈 / 队列 | +| 59-II. 队列的最大值 | 排序 | 数组,栈 / 队列 | +| 60. n 个骰子的点数 | 动态规划 | | +| 61. 扑克牌中的顺子 | 排序 | 数组,哈希表 | +| 62. 圆圈中最后剩下的数字 | 数学 | | +| 63. 股票的最大利润 | 动态规划 | 数组 | +| 64. 求 1 + 2 + … + n | | | +| 65. 不用加减乘除做加法 | 位运算 | | +| 66. 构建乘积数组 | 数学 | 数组 | +| 67. 把字符串转换成整数 | | 字符串 | +| 68-I. 二叉搜索树的最近公共祖先 | 搜索算法 | 树 | +| 68-II. 二叉树的最近公共祖先 | 搜索算法 | 树 |