LeetCode刷题经验
以下文本转载来自LeetCode的一位大哥的学习总结:https://leetcode-cn.com/circle/discuss/nRXySQ/
本人非计算机专业,接近 30 高龄才开始学习算法和数据结构,下面几个方法,想必大家也听过,因为我确实是通过这些方法得益的。以下文字仅供参考,请大家指点。
看 “答案”,明目张胆学习别人的智慧
看 “答案” 的前提是自己先做一下,自己要有思考。实在没有思路的话,我认为看答案也无可厚非,我们的工作不是让我们在封闭的环境中作业,我们可以通过各种方式搜索到解决方案。
当然有的问题,如果是解锁新技能的 “新题”,就直接看 “答案” 做,例如第 207、210 题 “拓扑排序” 的模板题,第 70 题:动态规划的模板题,第 46 题:回溯搜索的模板题。
看 “答案” 的时候看思路,尽量不要看完,看懂别人的思路,就尝试自己写出来,用自己习惯的变量命名和编码风格写,卡壳的时候,再看 “答案”。
即使是自己独立做出来了,我认为也有必要看 “答案”,开阔自己的思路,我写的很多题解就是看 “答案” 看出来的,看别别人的答案我认为很关键的一点是要思考,别人是怎么想到的,有的时候,看别人的 “答案” 会有一种“卧槽,我 TM 怎么没想到”的感觉。
输出,让别人给你挑刺
题目不是做完就完了,根据我的经验,即使是会做的题目,过一段时间再做一次也未必做得出来。因此 “输出” 就是一个不错的方法,逼着自己把问题搞懂、搞透。
“输出” 比较好的方式是:
你身边有人,你把这个问题跟他(她)讲清楚,你们之间有讨论;
如果没有这个条件,把自己的思路写成题解发布在力扣的讨论区、如果觉得自己的题解特别不错,就发到题解区让别人给你挑毛病,你的代码就会在各种 “挑剔” 中写得越来越好。
我自己写题解以来,在后期会模仿官方题解写复杂度分析,这一块的确是我比较薄弱,并且疏忽的地方,在题解的评论区也有很多小伙伴对指出了我错误的复杂度分析,并给出了自己的看法,所以分享是多好的一件事情啊。
还可以发布在自己的博客、知乎,发朋友圈我觉得都是可以的,只要是有人看,你自己就会想着把代码越写越好。
多题一解,锻炼抽象概括能力
把同一类问题放在一起做一个整理,有些问题真的是有一定套路的。
例如:
二分法问题:只要把怎么排除弄清楚,剩下的就全部是套路了;
回溯搜索问题:画树形结构,思考怎么剪枝,剩下的工作就是用代码把画图和剪枝的过程展现出来;
滑动窗口问题:是有模板的;
二叉树问题:一般都是分治的思想;
贪心算法:其实就是动态规划问题的所有子问题里,每一步都选那个最优的。
一题多解,锻炼发散思维能力
这个就蛮有意思了,越是难的问题,可能解法就越多。我有一点感触就是:越难的方法,效率越高,容错性就越低,越简单的方法,效率越低,容错性越高。我们有必要比较不同的方法的时间复杂度和空间复杂度,如果题目条件改一改、输入数据不符合题目要求,哪些方法还能奏效,哪些方法就失效了。
如果在面试中,你能够展示出一题多解的素质,我觉得是很加分的,当然可以讲究一些策略。比较好的一个策略是,先说朴素的、暴力的解法,同时也强调朴素、暴力解法存在的必要性,然后接着说一般性的解法,最后说有技巧性的解法。最后借用一个伟大的科学家说过的话:“天下没有免费的午餐”,各自分析不同方法的优劣,我觉得这种回答的方式就比较完美了。不建议一上来就说那个最有技巧的解法,这样面试官会认为你是有备而来的,并不是你真实的水平。
总结:万事开头难,请行动起来,多思考,多总结
以上就是我的一点点经验,倒不是说你真的这么做了,就能帮你解决所有问题,我觉得只要是我们付出了行动,真的迈开第一步去做了,我们的编码能力和解决问题的能力,都会逐渐得到提升,在这个过程中,你也有能力帮助他人,收获远比做出一道题要多。
刷题是个长期的过程,得用心,也有一定的方法,因人而异吧,希望能多听到大家的意见和建议。
作者:liweiwei1419
链接:https://leetcode-cn.com/circle/discuss/nRXySQ/view/if4vpv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。