又到了金九银十,最近在准备面试,算法这关一直是弱项,在leetcode刷题,但刷下来发现效率不怎么高,所以参加了算法挑战,想尝试下有没有好的刷题方法和技巧。
21天后回看,真是每天进步一点点,最后进了一大步。
真诚感谢张哥,感谢东哥,感谢菜花,感谢助教和志愿者,感谢一起努力学习的同学们。
1.算法挑战的收获
在参加算法挑战前,我的刷题是没有思路,只是在不断地刷题,一心想着通过题海战术,只要做得足够多,自然而然地就会掌握技巧。
但结果发现题目做出来了,但还是半懂不懂。
每次做完就忘,重新做都得想半天。。。
其实这就是没掌握正确的刷题技巧。
而经过这次的算法挑战,可以说我已经掌握了刷题技巧,起码有底气去挑战hard。
目前看来,刷题无非就是要在读懂题目考察的算法,然后会具体的算法技巧解答,
主要有两点:
1.识别题目需要的解决方案,需要哪种数据结构和算法技巧。
2.掌握通用的算法模板,填充具体的细节,如边界值和临界条件。
当然,也提醒我重要的一点,数据结构和算法一样重要。
打个比方,如果一开始问我,排序算法和树有什么关联?
我会说没有。
但实质上,快速排序就是前序遍历,归并排序就是后序遍历。
2.算法挑战是怎么刷题的
学习下来,会发现刷题和Java面试一样,存在着八股文。
只要掌握好套路,leetcode不难。
labuladong 老师将他的技巧在分享出来,我认为有两点对我有帮助:
1.对典型的题目进行分类,按算法和数据结构进行划分,
2.针对场景设计了通用的框架,然后再按题意填充细节。
那在挑战计划中是怎么落实的?
每周每天都会有对应的主题,我每天都坚持去做去归纳。
不断地从抽象到具体,从模板到实现。
第一周,数组,涉及到前缀和、回文串、二分查找、滑动窗口。
学会了前缀和的实现,无非是适合用前缀数组,用空间换时间;
学会了通过方法的映射,题目可以转换为二分查找;
学会了快慢指针、左右指针,可以实现数组和链表的快速查找。
第二周的链表、队列、栈、二叉树,涉及到单调队列、二叉树、BFS、并查集;
学会了二叉搜索树的递归是如此简单;
学会了BFS搜索套路,栈加上同层遍历;
学会了并查集的实现。
第三周的数据结构设计、回溯、递归更是重头戏。
学会了回溯的实现,就是递归加循环;
学会了动态规划的转移方程,通过归纳可以得出;
学会了LRU和LFU的套路。
