leetcode 100 斩!从第 1 题开始,到如今也差很少快一年了,回顾记念一下。git
从大一就知道了 leetcode,但刷题老是三天打鱼,两天晒网,会发现刷过的题,隔一段时间再看仍是须要好久才能再想起来,因而就萌发了刷一题总结一题的想法。github
另外一方面,leetcode 上的 discuss 里一些解,有时候讲解的不多,甚至只丢一些代码,对于我等这种菜鸟有时候看的太废劲了,因此不如本身把各类解法都理清楚,而后详细的总结出来,也方便其余人更好的理解。web
大一的时候,听过 ACM,而后暑假也去学校的 ACM 集训试了试,但当时基础太差了,栈和队列都不知道是什么,因此也就没有走上 ACM 的道路。以后就各类学安卓、web、后端的应用开发的一些东西了。后来准备开始刷题是大四毕业的时候了吧。算法
当时对回溯、动态规划也都只是上课的时候学过,也并不熟练。开始几题的时候,也都很慢,不少都本身想不出来。而后就去看别人的题解。看完之后,就什么都不看,而后按本身的思路再写一遍代码。后端
尤为是第 5 题,求最长回文序列,如今都印象深入,记得当时用了好几天才把全部解法总结了出来。微信
因此你们若是想刷题的话,也不用怕本身基础很差,大不了哪些名词不会就去查,一点点积累就能够,重要的是开始和坚持。框架
从开始可能只是以为该刷一刷题,到如今可能真的是爱上了刷题。工具
如今刷题基本能够想出一种思路,有时候甚至和最优解想到了一块儿,还会想出一些别人没有想到的解法,这种成就感可能就是打游戏超神的感受吧,哈哈。优化
此外,看 discuss 的时候,每当看到使人拍案称奇的思路的时候,真的是让人心旷神怡,开心的不得了,就像中了彩票同样的开心,赶快去和同窗分享。spa
有时候也会看到一些让人捧腹的评论,题目是输入一个字符串,输出全部可能的 ip 地址。
Input: "25525511135"
Output: ["255.255.11.135","255.255.111.35"]
在总结的过程当中,由于力求给他人讲懂,在理清思路的动机的过程当中,会发现以前的想法多是错的,会总结着总结着就明白了另外一种解法,或者产生新的想法,或者明白各个解法相互之间的联系,会比仅仅 AC 多出不少收获。
从理清他人的想法,再到本身写出代码,再到把各个解法用本身的理解串起来,会有一种「纸上得来终觉浅,绝知此事要躬行」的感受。有时候虽然大的框架有了,可是小的细节方面仍是须要本身去体会。为何加这个 if?为何是小于等于?每一句代码的产生都是有缘由的,毫不会是无关紧要的代码。
因此虽然一道题从看题,理解,本身考虑,看别人解法,到从新实现,再到总结出来,可能须要 三、4 个小时,甚至 五、6 个小时或者更多,但我以为是值得的。
此外,也有不少人加本身的微信过来亦或是感谢本身,亦或是指出错误,亦或是询问问题,亦或是没说过话的,哈哈。有微软、谷歌、百度、阿里、腾讯的大佬,有各个大学的学生,甚至巧的是还能加上高中的校友,世界真小,哈哈。
上边是最近加的一些人,每次收到别人的称赞本身也会很开心。此外,博客是直接放在 github 上的,目前也有 280 stars 了,是本身 github 上 start 数最多的项目了,说来也惭愧,但愿之后本身努力能够有一个好的开源项目。
一些人可能会纠结用什么语言去刷,其实不必纠结的。刷题须要考虑的是算法,而不是语言。算法就像是从家里到超市该怎么走?出门左拐,右拐直走….而语言是咱们选择的交通工具,骑车?步行?开车?平衡车?每种交通工具都有本身的优势和缺点,语言也是如此。而好的算法可能更像是,咱们偶然发现了一条近路,下降了咱们的时间复杂度或者是空间复杂度。
刷了 100 道题了,我以为必需要掌握的就是递归的思想了,利用这个思想能够解大部分的题了。计算机擅长的就是记忆以及速度,而递归能够把这两个优点发挥到极致。遇到问题之后,咱们能够考虑如何把大问题分解成小问题,想出来之后,代码很容易就出来了。
此外,一些递归能够用动态规划的思想改写,从而优化递归压栈所消耗的时间,递归是顶部到底部再回到顶部,而动态规划经过存储,直接从底部到顶部解决问题。
最经典的例子就是斐波那契数列了,求第 n 项数列的值。
斐波那契数列,指的是这样一个数列:一、一、二、三、五、八、1三、2一、34 …… 在数学上,斐波纳契数列定义以下:F ( 0 ) = 0,F ( 1 ) = 1 , F ( n ) = F ( n - 1 ) + F ( n - 2 )(n >= 2,n ∈ N*);
若是用递归的思想去写,代码简洁而优雅。
long Fibonacci(int n){ if (n == 0) return 0; else if (n == 1) return 1; else return Fibonacci(n-1) + Fibonacci(n-2); }
固然,这样的话太慢了,优化的话,就是把递归过程的结果保存起来,或者就是改写成动态规划,最强的是实际上是有一个公式的,直接利用公式就能够。
此外,还有一些题目就是根据题目的理解去写代码了,没有什么特殊的技巧。
固然是继续刷下去了,很开心,天天不刷一刷题会不习惯的,但愿你们也早日感觉到刷题的乐趣,哈哈。
在线地址:https://leetcode.wang,域名也比较好记,但愿对你们会有帮助。
我是用 gitbook 搭建的,我以为上边「搜索」的插件很好用,能够直接根据关键字搜出来本身想作的题。
知乎专栏也会同步更新:https://zhuanlan.zhihu.com/le...。
越努力,越幸运,共勉。