结论先行,刷题策略:《代码随想录》的回溯、贪心、动态规划、二分、双指针 +《算法图解》的动态规划 +《剑指offer》全书
1 问题
我从校招找工作开始就有个痛点,动态规划,贪心算法,或者没有刷到过的回溯,都不会。这些是我认为的hard程度的题,我也曾花了些时间看教程,但始终学不会。
对待面试时的coding,我一直的想法是如果出了上述我不会的hard题,那这家公司跟我本来就是无缘,错过了也不可惜。
我还给自己找了借口:毕竟我不是计算机专业出身的,coding做的好说明一个人真牛逼,但做不好不能说明他不牛逼。
后来在《看不见的大猩猩》,看到了一句特别应景的话:
人类的自信错觉:表现好是因为自己本身实力强,表现不好是运气差,或者是因为一时的粗心大意。总之,人们经常忽略能力这个最重要的因素。
解决方法只有一个,提高能力。
应用到coding上,就是做出来了是我牛逼,做不出来是我运气差,从来不觉得是自己能力问题。
我刷leetcode时遇到最大的问题是什么?
没有找到合适的教程,题太多了刷不过来,没有思路。
看题解吧,五花八门,不知道看哪个好;看懂一道题再写出来要1个小时,没时间;看懂了也是强行记住,下次遇到类似的问题还是不会。
所以有一个好的教程是最好的。
校招和两年前找工作时用的是《剑指offer》,出的题虽高频,但还是有很多看不懂的,并且也没有系统梳理。
后来看《程序员代码面试指南》,微信读书推荐值85.3%,我尝试看了看,不对胃口,这哪里是书,只是作者自己的刷题思路,一点也不系统。
今年在搜全排列问题时发现了代码随想录网站,发现这个教程是真的好。
2 收获
第一个是回溯法,真是令我恍然大悟,醍醐灌顶,来来回回看了4遍。
他的回溯法公式,图解,回溯就是暴力搜索理念,让我彻底克服了这个知识盲点。
组合,子集,全排列,切割等问题,都可以用他总结的模板,惊为天人。
第二个是二分查找算法的边界确定。
作者提出了循环不变量这一概念,彻底解决了我多年的二分查找的终点记混问题。对我来说,始终记不清楚while循环条件到底是left<right还是left<=right,更显左右边界时到底是L=mid+1,还是l=mid。
**一句话,while循环里的边界要和更新左右边界时保持同样的区间表示。**如果while循环是左闭右开区间,那更新左右边界时也是左闭右开,如果while训练里是坐闭右闭,那更新时也是左闭右闭。
此理念同样适用于根据前序和中序遍历结果重建二叉树这道题,其实区间是左闭右开。剑指offer里关于此题没有解释为什么,我最初还是强行记忆,一头雾水。
第三个是动态规划0-1背包问题。
一开始看《代码随想录》讲的0-1背包并没有看懂,后来有人在评论说是看了《算法图解》看明白了,我就也去看了,果然看明白了。
然后又跟着《代码随想录》刷了一遍动态规划,至少懂一些。买卖股票的7个变种,0-1背包中只能取一次和取无限次的公式,总结得都很好。
3 教训
当我关注《代码随想录》公众号时,我发现有42个朋友关注。更讽刺的是,这本书2021年就有了。
2021年是我第一次跳槽,我当时还是拿着3年前校招时买的《剑指offer》在复习。我被固有的认知束缚住了。
如果那时我多问几个人,说不定就就会有人推荐《代码随想录》,那样的话我就提前两年掌握了我今天才掌握的知识。
这充分说明了交流的重要性,"读大量的书,和大量的人交流",这样才更有可能打破固有的思维。
最后,还有一个思维上的小技巧,刷题时,如果觉得这道题自己会了,纠结要不要做时,就花三分钟做一下。
如果你很熟悉,三分钟就写完了,不算浪费时间,权当又复习了一遍;如果你不会或者不熟悉,这次尝试就测出了你的知识漏洞。
其实面试时的coding跟高考一样,考的是熟不熟,而不是会不会。
最后的最后,我的认知肯定是有限的,如果有读者有更好的教程推荐,请一定评论分享一下,给你比一个大大的心。
越分享,越成功。