第一章 序章 关于 LeetCode
说到 LeetCode,作为一个程序员来说,应该不陌生,近几年参加面试都会提到它。国内外的程序员用 它刷题主要是为了面试。据历史记载,这个网站 2011 年就成立了,⻢上就要到自己 10 周年的生日 了。每周举行周赛,双周赛,月赛,在有限时间内编码,确实非常能考验人的算法能力。一些大公司赞 助冠名的比赛获得前几名除了有奖品,还能直接拿到内推的机会。
什么是 Cookbook
直译的话就是烹饪书,教你做各种⻝谱美⻝的书。经常看 O'Reilly 技术书的同学对这个名词会很熟悉。
一般动手操作,实践类的书都会有这个名字。
为什么会写这个开源书
笔者刷题刷了一年了,想和大家分享分享一些做题心得,解题方法。想和有相同爱好的人交个朋友,一
起交流学习。对于自己来说,写题解也是一种提高。把一道深奥的题目讲给一点都没有头绪的人,并能
让他完全听懂,很能锻炼人的表达能力。在讲解中很可能还会遇到听者的一些提问,这些问题可能是自
己的知识漏洞,强迫自己去弥补。笔者在公司做过相关的分享,感受很深,双方受益都还不错。
另外,在大学期间,笔者做题的时候最讨厌写题解,感觉是浪费时间,用更多的时间去做更多的 题。现在不知道算不算是“出来混的,总是要还的”。
关于书的封面
常看 O'Reilly 动物书的同学一看这个封面就知道是向他们致敬。确实是这个目的。O'Reilly 的封面动物 都是稀缺动物,并且画⻛都是黑白素描⻛。这些动物都有版权了,所以只能在网上找没有版权的黑白素 描⻛的图片。常⻅的能找到 40 张这种⻛格的图片。不过用的人太多了,笔者费劲的找了其他几张这种 图片,这张孔雀开屏是其中一张。孔雀开屏的意义是希望大家刷完 LeetCode 以后,提高了自身的算法 能力,在人生的舞台上开出自己的“屏”。全书配色也都是绿色,因为这是 AC 的颜色。
关于作者
笔者是一个刚刚入行一年半的 gopher 新人,还请各位大佬多多指点小弟我。大学参加了 3 年 ACM- ICPC,但是由于资质不高,没有拿到一块金牌。所以在算法方面,我对自己的评价算是新手吧。参加 ACM-ICPC 最大的收获是训练了思维能力,这种能力也会运用到生活中。其次是认识了很多国内很聪明 的选手,看到了自己和他们的差距。最后,就是那 200 多⻚,有些自己都没有完全理解的,打印的密密 麻麻的算法模板。知识学会了,终身都是自己的,没有学会,那些知识都是身外之物。
笔者从 2019 年 3 月 25 号开始刷题,到 2020 年 3 月 25 号,整整一年的时间。原计划是每天一题。实 际上每天有时候不止一题,最终完成了 600+:
一个温馨提示:笔者本以为每天做一题,会让这个 submissions 图全绿,但是我发现我错了。如 果你也想坚持,让这个图全绿,一定要注意以下的问题:LeetCode 服务器是在 +0 时区的,这个 图也是按照这个时区计算的。也就是说,中国每天早上 8 点之前,是算前一天的!也是因为时区 的问题,导致我空白了这 22 个格子。比如有一道 Hard 题很难,当天工作也很多,晚上下班回家 想出来了就到第二天凌晨了。于是再做一题当做第二天的量。结果会发现这 2 题都算前一天的。 有时候笔者早上 6 点起床刷题,提交以后也都是前一天的。
(当然这些都是过去了,不重要了,全当是奋斗路上的一些小插曲)
2020 年笔者肯定还会继续刷题,因为还没有达到自己的一些目标。可能会朝着 1000 题奋进,也有可能
刷到 800 题的时候回头开始二刷,三刷。(不达目的不罢休吧~) 关于书中的代码
代码都放在 github repo 中,按题号可以搜索到题目。
本书题目的代码都已经 beats 100% 了。没有 beats 100% 题解就没有放到本书中了。那些题目笔者会
继续优化到 100% 再放进来。
有可能读者会问,为何要追求 beats 100%。笔者认为优化到 beats 100% 才算是把这题做出感觉了。 有好几道 Hard 题,笔者都用暴力解法 AC 了,然后只 beats 了 5%。这题就如同没做一样。而且面试中 如果给了这样的答案,面试官也不会满意,“还有没有更优解?”。如果通过自己的思考能给出更优解, 面试官会更满意一些。
LeetCode 统计代码运行时⻓会有波动的,相同的代码提交 10 次可能就会 beats 100% 了。笔者开始没 有发现这个问题,很多题用正确的代码连续交了很多次,一年提交 3400+ 次,导致我的正确率也变的奇 高。
当然,如果还有其他更优美的解法,也能 beats 100% 的,欢迎提交 PR,笔者和大家一起学习。
目标读者
想通过 LeetCode 提高算法能力的编程爱好者。
编程语言
本书的算法全部用 Go 语言实现。 使用说明
本电子书的左上⻆有搜索栏,可以迅速帮你找到你想看的章节和题号。
本电子书每⻚都接入了 Gitalk,每一⻚的最下方都有评论框可以评论,如果没有显示出来,请检查
自己的网络。
关于题解,笔者建议这样使用:先自己读题,思考如何解题。如果 15 分钟还没有思路,那么先看
笔者的解题思路,但是不要看代码。有思路以后自己用代码实现一遍。如果完全不会写,那就看笔
者提供的代码,找出自己到底哪里不会写,找出问题记下来,这就是自己要弥补的知识漏洞。如果
自己实现出来了,提交以后有错误,自己先 debug。AC 以后没有到 100% 也先自己思考如何优
化。如果每道题自己都能优化到 100% 了,那么一段时间以后进步会很大。所以总的来说,实在没
思路,看解题思路;实在优化不到 100%,看看代码。
互动与勘误
如果书中文章有所遗漏,欢迎点击所在⻚面下边的 edit 按钮进行评论和互动,感谢您的支持与帮助。
最后
一起开始刷题吧~