「 剑指 OFFER 系列题解 」 扬帆,起航
34888
2020.05.20
2020.05.20
发布于 未知归属地

为何推荐剑指 Offer ?

开始刷题前,学长们清一色地向我力荐剑指 Offer 。一年以来,我已将剑指 Offer 刷了数遍,这使我在科研学习、秋招求职中受益匪浅。总体上看,剑指 Offer 或许是最友好、最适合求职初学者的题库之一,优点如下:

1. 知识全面

LeetCode 的题库庞大,以下每个分类都能筛选出数百道问题。而由于精力有限,我们只能做完部分题目。因而我们需要解决两个难题:从哪个分类开始做题?每个分类做哪些题?

  • 数据结构: 数组、栈、队列、字符串、链表、树、图、堆、哈希表、……
  • 算法: 动态规划、回溯算法、查找算法、搜索算法、贪心算法、分治算法、位运算、双指针、排序、模拟、数学、……

剑指 Offer 的短短 75 道题,涵盖了以上所有分类,能够帮助我们 快速入门

2. 题目典型

做典型题目可以事半功倍,无论是对于面试准备,还是知识积累。剑指 Offer 原题活跃在各大公司的笔面试中。根据笔者亲身经历,面试手撕算法 的遭遇概率较高,笔试 相对较低(但有许多原题的变种)。

3. 资料完备

对于初学者来说,遇到新的题目常常无从下手。因此,优良的题解资料尤其重要,其很大程度上 决定了刷题效率和质量 。剑指 Offer 热度较高,无论是在 LeetCode 的题解区和评论区,还是在搜索引擎和各大平台中,都可以找到丰富的学习资料。


剑指 Offer 系列题解

经过笔者近三个月的日夜奋斗,已更新 近 70 道原创题解 ,希望可以帮助到像我当初同样一头雾水的同学。

题解中均介绍最优解决方法之一(部分题目介绍多解法),内容包括:

  • 解题思路: 介绍解法的来龙去脉,解法往往是从简单的想法、数据结构的定义、算法的原理导出的。
  • 算法流程: 可理解为详细的代码注释,致力于帮助各位养成结构化、模块化的代码编写习惯。
  • 复杂度分析: 时间和空间复杂度是评价解法优劣性的最有力的尺度之一,且面试经常会被问到。
  • 清晰配图: 帮助各位理解解法的重难点,并提供测试样例的可视化运行。
  • 代码: 笔者只会写 Python 3 / Java ,其他语言代码可在题解评论区寻找,感谢大佬们的无私分享。

若读完题解仍有疑问,推荐各位转至题解评论区,很大概率可以找到满意的答案。

剑指 Offer 题库 追风赶月莫停留,开始做题叭!
@Krahets (jyd) 敬请关注力扣主页,欢迎评论、分享、点赞,我会尽快回复。
由于水平有限,题解错漏缺点在所难免,烦请各位大佬指正。

下表划分了解决各题使用的算法。由于题目往往有多种解法,本表格只列举最优解法(时间与空间复杂度最低)的对应算法。

动态规划回溯算法查找算法搜索算法贪心算法分治算法位运算双指针排序模拟数学
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. 二叉树的最近公共祖先

下表列举了各题涉及到的主要的数据结构。

数组字符串栈 / 队列链表哈希表
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. 二叉树的最近公共祖先

后记:

于我而言,力扣平台带来的已不单单是题目本身,更多的是来自大佬的教诲、同学的探讨、读者的支持、深夜顿悟的欣喜、数次想逃避放弃时的加油鼓励。

在很多个前路尚未尘埃落定的焦躁的盛夏夜晚,逐渐成长学会和不良情绪对抗的纠结的初秋午后,以及最终得到肯定收货结果的冬日清晨,力扣见证着我的进步和前行。

人生的新阶段即将到来,利用自由时间把题目一一整理起来,希望和大家共勉,也希望自己的小小努力也能给别人带去小小帮助。这也应该是这段日子的另外的意义了吧。

本文献予像我一样热忱而迷茫的初学者。

扬帆,起航!

评论 (70)