算法一直都是自己的弱项,这与自己之前的轻视是分不开的,所以为了弥补之前的缺失,特建立该仓库,记录自己解决 Leetcode 各个习题的过程。
每个问题可能会包含多个 Solution,一般前几个都是自己独立解答及优化过的算法,最后的多是该问题目前的最优算法,非本人独立解决。Playground 中会带有说明注释,但是因为是练习性质的仓库,缺少对注释的严格校对过程,所以不排除存在因疏漏而未标注的地方。
遇到陌生的算法题,首先要确定思路方向,脑子笨就先用笔在纸上写伪代码,然后在去实现,最后在解决边界问题。
在解递归的过程中,切忌不可深入思考多层,否则只会让脑子陷入混乱,只要考虑清楚一个环节中要解决的问题即可,然后找到一个恰当的终止条件。
任何算法都不是一蹴而就的,它是一个循序渐进的过程,实现了第一版的算法后就要考虑哪些环节是可以优化的,如何减少循环次数,如何减少占用空间等等,从而得出第二版、第三版...。
对同一思路下的算法优化,就是尽力缩减非必须指令数,力争用更少的指令完成任务,这就需要对计算机有更深入的了解。此外就是语言本身,不同的编程语言有其自身特点,只有熟悉它才能畸形针对性的优化。但是对于我等新手来说切忌铺的太开,想遍地开花是不现实的,先着重深入了解自己最熟悉的语言,之后在横向拓展方能事半功倍。
算法优化是有限的,如果要实现指数级的优化,必须对问题有深入的了解,摒弃过去,另辟蹊径,而且要具有一定的数学知识,例如:通过黄金分割法求斐波那契,这种特别的求解方式可不是通过对现有算法优化就能得到的,要扩大知识面,多接触,多练习,多多多交流。
如果一个问题半个小时都想不出头绪,连最暴力直观的想法都没有,那就去找人请教吧,或者 Google 一下,翻翻 LeetCode 的评论。因为这很可能是因为你知识储备不足造成的,及时的求援可以更快的发现不足,避免浪费时间,解决知识短板。当然卡壳也可能是自己理解出现偏差,或者思考过多导致的,这就得靠自己细心梳理,回顾具体是在思考过程中的哪个环节出现了问题。
了解完别人的思路后并不等于自己就会了,下次题目稍加变形可能还会卡壳,要多写,尤其是大龄程序员思绪不容易集中,更要多写代码。读书百遍其义自现的道理这里也同样适用。
最后,也是最重要的一点,求援不丢人,正所谓:“闻道有先后,术业有专攻,如是而已。”
保留所有权利。