《剑指offer》刷题总结

从三月初开始刷剑指offer上面的题,到现在花了近二十天的时间终于刷完了。应该说,掌握上面的技巧应付一些公司面试题和小公司的笔试题是完全没有问题的。之前参加一个公司笔试,算法题就有一题是剑指offer上二维数组查找的那题(AcWing15),较为简单,但是应付大公司的笔试可能还远远不够。剑指offer的76道题目的题解链接是《剑指offer》题解。(下面题号较多便不附上各题的链接了)

下面简单总结下该数涉及的知识点。

主要涉及的有查找,二分,哈希,字符串,排序,以及数据结构(二叉树,栈,队列,单链表,堆等等),对数据结构要求较高。同时还涉及特殊的技巧,比如数位问题,位运算,单调队列等等。算法方面仅涉及简单的dfs,bfs以及动态规划,贪心等。

1.哈希

哈希表在该书多道题的算法中都有体现,主要用于元素值有限的情况,比如AcWing13-所有元素的值都在一定范围内,还有像字母个数有限也可用哈希,比如AcWing63。当然空间换时间来降低时间复杂度也可使用hash,如AcWing75。

2.二分

二分出现的频率还是挺高的,最常规的二分是有序数组查找某元素的位置,简单根据单调性来二分的题目比如AcWing69。但是很多二分变种则需要细心了,比如含重复元素的二分AcWing67,找缺失元素的二分AcWing68,还有跟数组两端元素比较大小来二分,如AcWing22;以及数组无序需要根据元素值的范围来二分的AcWing14.总而言之,二分首先要确定我们要查找的是什么,是不大于某数字的第一个元素,还是大于某个数字的第一个元素,有没有重复数字,才能弄清l,r指针的移动及边界。

3.字符串

出现了一些字符串的简单模拟,比如AcWing16,AcWing87,AcWing31等。还有较为复杂的匹配比如正则表达式匹配AcWing30,当然字符串翻转问题也是很简单的,比如AcWing77,AcWing78.

4.单链表

单链表涉及的题型较多,反转链表时,如果只要求输出反向序列,只要用向量的反向迭代器做返回值即可AcWing17;但是要实现链表真正的反转,就需要一定的技巧,头插法或者直接指针反转AcWing35。单链表其它的操作也均需要特殊的处理技巧,比如特殊的删除方式AcWing29,特殊的查找AcWing33,特殊的复制AcWing48,以及利用归并排序去合并两个有序链表AcWing36。还有一种通过特殊的遍历技巧,遍历到某结点再从头开始遍历,以此来查找特殊的结点,比如查找环的起点AcWing66,查找两个链表公共起点AcWing34.

5.二叉树

二叉树可能是所有题型出现数量中唯一一个不少于单链表的,只要是二叉树的题目,基本都逃不过递归,毕竟二叉树本身就是递归定义的。我们用递归建树AcWing18,还需要了解各种遍历方式的模拟以及使用变形,比如求中序的下一个结点AcWing19,。还有层次遍历及其变形AcWing43,44,45。以及前序遍历过程的模拟AcWing50.更加常见的题目就是利用递归的性质将问题分解为几个子问题,通过子问题求解从而得出问题的解,这种题目我们需要假设某函数能够实现该功能,然后分析子问题是如何合并成总问题的,比如AcWing38,39,71,88。当然,还有常规的dfs遍历AcWing47,以及较为复杂的递归嵌套求树的子结构AcWing37.。

6.BST

BST作为特殊的二叉树,因其中序序列有序的性质也经常出现。利用中序性质或者模拟中序遍历过程的题目有AcWing49,70,也有需要我们对BST后序遍历序列特征很熟悉的题目AcWing46。最后还有道AVL的题目,简单的递归即可求出AcWing72.

7.栈

栈的题目较少,要么是利用其后进先出的性质来模拟队列AcWing20,要么就是判断栈混洗是否合法AcWing42.

8.dfs

dfs主要在二叉树的问题中考察了,其他的还有,简单的搜索AcWing23;较为复杂的全排列变形问题AcWing51,以及对我们理解dfs,记忆化搜索和动态规划之间的联系很有帮助的题目AcWing80.

9.bfs

bfs也是主要出现在了上面模拟树的层次遍历的题目中,单纯考察bfs的只有AcWing24,求连通域的问题。

10.贪心

贪心问题基本没有,但是很多题目还是利用了下贪心的性质。如AcWing25。

11.位运算

位运算题目也不少,需要我们对计算机内部存储方式以及运算细节体会较深。比如AcWing26,以及异或的较为复杂的应用AcWing73,和基于状态机需要我们自定义运算的题目AcWing74.

12.排序

排序的问题基本都是让我们利用各种排序的思想去解决其他问题的。比如利用快速排序的思想AcWing32,普通归并排序的思想AcWing65,以及三路归并的思想AcWing62.

13.模拟

模拟的题目广泛分布于各种题型中,也有简单的模拟比如AcWing40。

14.单调栈

单调栈的问题就考察了一道AcWing41.

15.特殊技巧

还有些题目需要采用特殊的技巧才能解决。比如像玩游戏时水晶的增减一样来解决AcWing52,以及限制各种操作来求和AcWing84,85,其实还是利用了位运算的性质,最后还有特殊的除法操作AcWing86.

16堆的应用

堆的应用就两道,但是都相当的经典,不采用堆去解决便相当的不方便。AcWing53,54.

17.递推与动态规划

需要利用解单调性的dp问题比如子序列的和AcWing55,股票问题AcWing83,还有一些简单的dp如AcWing59,60。稍微不好推导状态转移方程的约瑟夫问题AcWing82.

18.数位问题

数位问题不是很难但是都需要推导公式,能做出来也很不容易。比如AcWing56,57,58.

19.单调队列与双指针

该书还出现了一种重要的题型就是单调队列问题。倘若问题的解具有单调性,那么很可能就需要使用单调队列或者双指针法来解决,比如AcWing61,64,76.一些情况下甚至需要使用双端队列,比如AcWing79.

20.其他问题

还剩下一些简单的问题AcWing21,27,以及稍微要有点整体思维来解决的问题AcWing81.

你可能感兴趣的:(经验总结)