
写在前面
时光匆匆白驹过隙,不知不觉来力扣刷题也快五个月,我的竞赛分却还没有解题数多的痛谁能懂呜呜,后面立志尽量不刷新题多复盘做过的题目;
感觉还是使用力扣的姿势不对,中前期一味地做个刷题机器,没有及时总结输出,对于太难的解法当初又实在不懂需要打卡的直接CV大法跳过;
话说回来比起遇到不会做的题,可能更大的挫折感来自于看似很简单但我就是看不懂的一篇篇题解,感慨人与人之间的巨大差距;
好在也看过很多可圈可点的题解,但总的来说心目中的完美题解还是不多,今天就来说说我心目中比较好的题解构成元素,并尝试着按照CleanCode代码整洁之道和AutomaticDriving自动驾驶的分级L1到L4来试着分一下。
题解元素
- 提交结果:即在本语言提交当中时间与空间的比较情况以及测试用例个数,以防力扣的测试用例随着时间可能会有增减
- 整洁的代码:符合本语言业界常用或者风格较为一致,有良好的对象命名与语言组织方式
- 解题思路:分析题意抓住要点脉络,转换为可解的算法问题,逻辑清晰鞭辟入里,形式上文字、公式、图解、视频依次更好,但不知为什么有时候反而不是很喜欢视频,我更喜欢图解与公式一点,其实图解也不难可以PPT走起,或者白纸黑字画完拍照
- 数学证明:对于必要的如贪心之类的说明为何是最优解,或者一些基础的原理说明
- 复杂度分析:应该是题解的基本操作,复杂度很能说明一个题目以及解题思路与算法的效果,能将这些神奇地串起来
- 性能优化:像是动态规划的状态降维之类的算法技巧,本语言的不同函数与结构方法的性能影响之类的
- 算法标签:最好能对应一些常见的题目标签如排序、哈希、深搜、广搜、回溯、并查集这些
- 关联题目:有很多题目都是可以用类似的思路解决,或者说是进阶版与简易版,可以很方便地举一反三
- 算法模板:对于线段树树状数组这些应该是有较为通用的大致模板的,可以帮助理解与运用相关算法
- 多种解法:有不同的算法可以解决同样的问题,并进行对比分析优劣
- 多种语言:对于不是那么很精通各种语言的人来说比较友好
- 整体排版:逻辑线较为清晰,分块合理,堪比书籍或者论文的行文方式
- 路码一致:指解题思路与代码之间能够有很好的对应,像是基本的变量名和题解的一些符号最好能对应之类的
题解等级
- L1:整洁的代码,良好的排版格式与命名,有少量注释与说明,具备上述题解元素2+个
- L2:具备较为清晰简洁的解题思路,具备上述题解元素4+个
- L3:良好的时间复杂度与空间复杂度,说明性能优化点,具备上述题解元素6+个
- L4:循序渐进逐渐优化的方法说明一题多解,且均有提交结果对比与复杂度分析,清晰的解题思路,必要的完备的数学证明,有多种语言,针对每种语言有较为精妙的函数使用方式,具备上述题解元素10+个
抛砖引玉
之前有段时间沉迷写排版整洁的题解,一步步做改进,最近反而有些懈怠了;
其实写题解方面完全符合二八定律,只需要做百分之二十的努力就能看起来比百分之八十的题解要好;
分享几个我写的题解,还不太理想,实在是没有更多时间和精力,一心扑在蓝牌之路上二三三三;
写在最后
其实好多人可能也没有心思或者精力去写一篇好的题解或者和我一样就是单纯水一下声望哈哈;
不过写题解有时候也可以当作是刷题烦了之余的复盘总结与消遣,也能锻炼自己写技术文档的能力,在实际工作中应该也很有帮助;
还有就是很多题的题解已经写了好多,经典的解法也都写完了的,这种就适合灌水不被发现嘿嘿;
应该说有下面几个特点的题解值得一写:
- 题解数量也就小几百的
- 官方还没有题解或者题解不太好的
- 本语言的题解较少或者没有理想题解的
- 对自己有启发性没遇到过的算法或者解题思路的
- 有更好的解法或者独特思路的
- 想要水声望每天最多三篇题解可以加六分的
两点参考
- 关于Markdown的基本语法可以参考Markdown菜鸟教程或者遇到不会的直接网上搜,非常简单,五分钟包学会
- 关于数学公式的基本语法可以参考Latex在线编辑器的各种模板,对于力扣上的题解来说完全够用,也非常简单,五分钟包学会