本文主要记录阅读剑指Offer这本书所遇到的算法解释并作一些个人的拓展,其中的算法面试题请看剑指Offer面试题集
4.2 画图让抽象问题形象化
画图可以帮助面试者分析、推理问题,借以辅助自己观察和思考,使抽象问题具体化,找到解题的关键
对于数据结构问题,如二叉树、二维数组、链表等,画图可以让我们容易找出题目中隐含的规律和特点。
- 如面试题19中画图可以发现求树镜像的过程就是在遍历树的同时交换非叶节点的左右子节点
- 如面试题20中画图容易发现打印矩阵中的边界条件最后一圈退化的规律
- 如面试题26中可以发现画出每一步操作时的指针操作写代码会容易得多
画图还可以向面试官解释自己的思路,面试官会觉得面试者有良好的沟通交流能力
4.3 举例让抽象问题具体化
一眼看不出问题中隐藏的规律时,我们可以试者用一两个具体的例子模拟操作的过程
- 如面试题22中栈压入弹出序列可以分析一两个序列找到隐含的规律
- 如面试题24二叉搜索树的后序遍历序列,可以通过分析一两个具体序列找到后续遍历的规律
具体例子还可以帮助我们向面试官解释算法思路
- 如面试题21包含min函数的栈可以举例模拟压栈和弹出几个数字,分析每次之后的栈、辅助栈、最小值各是什么,能把复杂问题用简单方式说清楚
具体例子还可以确保代码质量,我们可以写完代码用几个测试用例在心里模拟结果,保证正确性
分解让复杂问题简单化
我们遇到复杂的大问题,可以分解成若干个简单的小问题,再逐个解决这些小问题
分治法采用的就是逐个击破的思想,将小问题各个解决结合起来解决大问题
- 如面试题26中将复杂链表复制过程分解成三个步骤
- 面试题27中转换整个二叉树为双向链表是一个大问题,我们将其分解成转换成左子树和右子树,再把左右子树得到的链表和根节点连接起来
- 面试题28中将整个字符串分为两部分,第一个字符和它后面的所有字符,整个字符串排列是个大问题,第一个字符之后的字符串排列就是个小问题了