本文非本人 原作者在美服 因不可描述的原因 在国服LC发文失败 他是我们DOTA战队的教练 我来替他代发
传送门:https://leetcode.com/xymabinogi/
美服非CS方向的Ph.D,平日只写过Matlab / Mathematica 加上一些奇奇怪怪的数学编程语言。因为快要毕业找工作的关系,觉得还是准备一门通用的程序设计语言比较好,于是就选择了C++。当时选择的原因是内心感觉C++的大佬比较多,高质量题解可能比较多,加上实验室CS的朋友天天吐槽Python太慢,于是就决定用C++了。当时并不知道Python是力扣最好的语言
在此记录一下自己的C++刷题过程,给大家提供参考。也借此感谢在跟我一起刷题的朋友和提供帮助的大神们。
虽然对C++的基础几乎是零,在六月中旬开始我还是直接上手力扣了,结果很快发现什么也做不下去。于是只好被迫折回去看了几天书,主要是《C++ Primer》和《A Tour of C++》,每本大概翻了一百来页吧。那之后大概就是基本边看边做了。
第一阶段我是按照力扣题号的顺序做的,大概做到了两百题左右。这个阶段的主要目的还是熟悉语法,STL等等。我的记忆力不太好,所以备了个文档专门记录一些常见的函数和数据结构。当时很多题目基本就是连抄带写的,以至于后面折回来的时候对有些题目毫无印象,有很多时候都有啊我的账号为什么会有这题的提交记录的感慨。 这个阶段我觉得比较重要的是多查函数库和文档,这样后面写起来才更有底气。 因为暑假,空闲稍微多一点,基本每天干完Research都在刷题。
在第一阶段的学习中我感觉到,这些题的考查要点大部分都十分分散,很难巩固。而且力扣自带的题目Tag太过粗旷,没有办法找到每大类比较有代表性的题目。我又尝试了美服力扣里面的一些专项电子书,但是又感觉节奏太慢。
在寻找之下我发现了代码随想录,作者列的题目不多,但是比较有代表性,而且也囊括了基本的大类,还配套有图片和视频,很适合我做初阶的训练。同样,也是因为题目不多的缘故,我刷的很快,而且渐渐感觉到作者的代码水平不够顶尖。接着我又发现了花花酱的题单 和他的视频 B站,花花酱的C++基本功很强,能写出很多C++的新特性,对我这种根本分不清C++ 11, 14, 17, 20的人再好不过了。反正只要学最新的。这个阶段在我看来重要的是了解基础数据结构和算法的框架,只要做到,很多题目都会变成填空题。
花花酱的题单题目也不多,很幸运,之后我发现了残酷群群主Wisdompeak的题单。
群主的题单非常适合我,量大(可能有将近两千题?),分类很细致,还有难度划分(虽然难度是个主观的东西)。于是我便重头开始刷群主的题单,这份题单比较难(比如我的千题中,medium和hard就比较多),开始啃起来十分吃力。
于是我自己准备了一份文档,记录下自己每一题的一些思路,尤其是错误的想法。我个人的风格不太喜欢给自己限时,所以经常一道题会纠结很久(但是需要判断,长时间的思考是因为缺乏工具还是缺乏思路,很多时候,尤其是起步,缺乏工具的思考是没有太多价值的),但这样也会有很多收获,至少会记录一堆不成熟的思路和WA代码,在复习的时候会把问题看的更加清晰。
这份题单我目前大概刷了60%左右,这应该也是我提高最快的一个阶段。这个阶段的要点我觉得是一题多解,证明和复杂度分析,一题多解能够让不同模块的知识产生相互联系,证明能够加强算法的直觉,复杂度分析提供了面对复杂问题的快速判断。
从注册开始的第一周我就开始打周赛了,印象中不管感冒发烧到现在我应该每场都参加了。周赛对我的作用主要是这么几点:
灵神, Tsreaper, Mumu大佬及其马甲的国服题解 (因为我的水平太差,只能看懂C++和Java的题解,但是同样也想感谢众多我没有提到的和不同语言的大佬们)。 说句题外话,因为平时做题我都在美服,我个人的体会是,新题的题解,国服远胜美服。可能美服众多大神都已经归隐,剩下的很多新题题解很多既不关注证明也不关注复杂度,排版也很糟糕。国服的情况就要好很多。感谢各位,因为你们力扣的社区才会充满活力。
hqztrue大神的题解和复杂度整理,其中的很多复杂度分析十分精彩,也有详细的Citation。虽然有些题目的理论界已经属于可以追溯到STOC论文的范畴,我也没有时间去深入理解,但是知道它说不定能在哪天用上。
Algorithms for Competitive Programming和中文站OI,有很多中级的算法数据结构的介绍,写的比较凝练,很适合快速上手。
USACO Guide,某些章节和题单质量不错,覆盖的范围也很广。能学到一些比较难的知识点。
还有一些比如像零神,一神这样停更了的空间,但是里面的算法知识是不会过期的。
刷题总体而言对我来说是一件很开心的事情做Research那就不一定了。因为我基本上在速成,对于C++语言本身的了解非常少,接下来可能会稍微减缓一下刷题的速度,去多读读一些语言基础和现代C++。
希望大家能在刷题的过程中保持心态。Happy Coding!
再次感谢社区的贡献者们,希望力扣社区越来越好。