回顾总结与重启
两年时间,LeetCode刷了600+的同时,我也了解、训练了很多经典的数据结构与算法问题。在刷题的过程中,对数据结构与算法有了更深的了解,对Python语言做了更多的实践。我相信,刷题不只是为了找工作,更多也是在提升自己。在此,记录自己刷题的总结与感悟。
我相信刷题的过程中有三种境界:
1、模仿与记忆。第一过程是最艰难,也是最基础的。对于没什么算法基础的同学,一开始接触KMP算法,马拉车算法,很难能够做到看一遍就会,做一遍就能默写的程度。这是反复的过程,只有多刷几遍相关题型,才能理解、领悟使用这种数据类型或者使用这种算法的技巧与优势。这一阶段要做到:給一道做过的题,能很快的回想起其使用的算法与算法的具体过程和本质。
2、分析与总结。这一阶段,我谓之培养“题感”的过程,也就是学习刷题套路的过程。在总结的过程中,才能真正了解为什么这种题要用这个数据类型,为什么这样能降低时间复杂度,下次什么题型也能采用这种技巧来解题。这一阶段要做到:给一类题型,能很快回想起该题型常用的技巧和算法,并能举出一二道最经典的例题。我之前的文章也大多是此类总结。
举个例子,比如要求一个数组中最长/最短达到某个条件的连续子数组,不妨考虑下以每个元素开始/结尾的时候,最长/最短的连续子数组。
3、思考与泛化。当做过一定量的题后,你已经对常用的数据结构、算法了然于胸,对于一道熟悉的新题,我想你能很快的想到常用的算法解法,并能很快说出他的最优时间复杂度与所使用的数据结构。但对于一道不熟悉的题,抛弃所谓的算法与数据结构吧,很多时候,思考的方式比固定的套路,有用的多。特别在笔试的时候,很少有题是你熟悉的套路题,这个时候要静下心来去思考,最优解法通常是通过推导、泛化得到的,而不是你认为最牛的数据结构(线段树、并查集之类)就能解决。
典型的,俄罗斯套娃问题。当然,一方面,你得了解最长递增子序列的经典解法,另一方面要思考如何能降低解法的时间复杂度,这里用的是排序,为什么排序能够优化解法呢?
另外,我的刷题建议是,先刷两遍剑指offer,然后根据分类刷LeetCode前100道,然后从101道开始顺序或者随机的训练。
正值秋招末端,我的刷题记录也到了一个新的阶段。秋招通过了微软的面试,我想也是对我数据结构与算法基础的肯定。接下来的计划是重启600+的LeetCode刷题总结,并准备用Python+cpp的方式实现,希望能继续提升吧。
与你共勉。