今年的2月比往常更长,不是因为比往年多了一天,而是被病毒隔离在家的日子显得十分漫长。如果再不给自己找点事情做的话,且不论身体方面的健康状况,精神方面可能也会有些隐忧。做为一名工程师,适时地读上几本平日可能没时间阅读的好书,应当是不错的选项。而除此之外,也可以做点有趣的算法题目以做消遣。
当今,LeetCode这个网站已经广为人知。打算刷算法题时,它几乎是必然的选择。当然国外还有CodeWar,国内也有牛客网这样的备选。不过由于几年前也曾在LeetCode上玩过几题的关系,当再次有刷题想法的时候,还是回归到那熟悉而又陌生的地方。
最开始的时候可能也只打算投入几天的时间去重温下做题的感觉,但随着隔离时间的延长,且年内计划也制订了认真研习算法这一项,不知不觉每日持续做题的日子已经过去一个月了。
迄今为止,简单难度的题目做了68道,中等难度的题目做了42道,困难难度的2道,总计112道。
先刷的是简单的题目,闲来一天可以做个5,6题,再之后开始做中等难度的,每日坚持做3题,至于困难的题目,则是无事可做时想尝试下挑战的。当然这样的结果是必然查找功略才能有些线索。
LeetCode经过数年的发展,已经从最初的触手可及的100多道题,变成为拥有1364题的真正意义上的题库,这个数字记录截止于2020/2/29,之后肯定还会增加。(在做题的时候就发现其偷偷地又多了几题)
我刷题的方式不是如他人一般选取其前几百题做为开端,而是采用主题突破的策略。
在LeetCode网页的右侧有各种主题的汇总。
- 数组 226
- 动态规化 185
- 数学 171
- 字符串 159
- 树 128
- 哈希表 122
- 深度优先搜索 117
- 二分查找 84
- 贪心算法 73
- 广度优先算法 65
- 双指针 60
- 栈 54
- 回溯算法 53
- 设计 46
- 位运算 44
- 排序 43
- 图 40
- 链表 37
- 堆 34
- 并查集 29
- 滑动窗口 20
- 分冶算法 19
- 字典树 17
- 递归 15
- 线段树 12
- 有序字典 10
- 队列 9
- 极小极大算法 8
- 二叉索引树 6
- 行扫描算法 6
- 随机算法 6
- 拓扑排序 6
- 迷题 5
- 几何算法 5
- 二叉查找树 2
- 拒绝采样 2
- 水库采样 2
- 旋转哈希 2
- 记忆 1
- 后缀数组 1
可以看到在各个主题之中,渉及数组的题目占比最多。稍做思考,不难想出这一结果也合乎情理,毕竟数组是最基本的数据结构,如果不把其弄清楚,想明白,更没有能力去触及其它算法与数据结构的内容了。
于是顺乎其理,我以数组这一主题开始了算法新旅程。刚入手时其题目数还是224道,结果两周后又增加了2道,目前还未有进一步的更新,所以并不清楚LeetCode题库更新的频率。
在刷题的时候会发现,一道题目往往不仅牵扯单一主题,还会与其它主题相关,做这类题目时获得的收获往往也更多。同时网站上确实有功能可以将题目所附的标签显示出来,建议最初时不要打开这一选项,因为知道了题目的特性,可能也就明白了解题的思路,但在刚开始答题的阶段,这样的提示并不有利于思考,只有在自身经过一番推敲琢磨之后,再查看这些信息,才能获得更佳体验。
当然,做这些题目,尤其是中等以上难度的题目,既使花上几个小时,解不出题,也是正常的情况,本人便是一例。因为之前没有仔细在算法方面打磨过自己,对算法题的生疏也是在所难免。这并非要给自己找一个推脱的借口,算法,就像其它有价值的能力一样必须要经过相当时间的刻意练习,才可以达成某种程度的熟练度。
种一棵树最好的时间是十年前,其次是现在。既然十年前自己没有努力提升算法能力,那么到了今日,还有这个念想的话,只有迈步前行一个方法而已。
这里只是些闲谈,并不会详细记录每道题的解法,在刷完数组主题所有题目后应该会有一篇比较详实的记录,这里又定了个小计划。再之后将会聚焦于LeetCode中100道最受喜爱的题目,完成后继续做总结,然后会是动态规划主题,还是需要总结,如此这般持续进行,虽然期望在一年内完成所有题目,但估计不太可行,不如退而求其次,能够养成经常做算法题目的习惯,反而会是更好的收获。