又到了金九银十,最近在准备面试,算法这关一直是弱项,在leetcode刷题,但刷下来发现效率不怎么高,所以参加了算法挑战,想尝试下有没有好的刷题方法和技巧。
    21天后回看,真是每天进步一点点,最后进了一大步。
    真诚感谢张哥,感谢东哥,感谢菜花,感谢助教和志愿者,感谢一起努力学习的同学们。

    1.算法挑战的收获
    在参加算法挑战前,我的刷题是没有思路,只是在不断地刷题,一心想着通过题海战术,只要做得足够多,自然而然地就会掌握技巧。
    但结果发现题目做出来了,但还是半懂不懂。
    每次做完就忘,重新做都得想半天。。。
    其实这就是没掌握正确的刷题技巧。

    而经过这次的算法挑战,可以说我已经掌握了刷题技巧,起码有底气去挑战hard。
    目前看来,刷题无非就是要在读懂题目考察的算法,然后会具体的算法技巧解答,
    主要有两点:
    1.识别题目需要的解决方案,需要哪种数据结构和算法技巧。
    2.掌握通用的算法模板,填充具体的细节,如边界值和临界条件。

    当然,也提醒我重要的一点,数据结构和算法一样重要。
    打个比方,如果一开始问我,排序算法和树有什么关联?
    我会说没有。
    但实质上,快速排序就是前序遍历,归并排序就是后序遍历。

    2.算法挑战是怎么刷题的
    学习下来,会发现刷题和Java面试一样,存在着八股文。
    只要掌握好套路,leetcode不难。

    labuladong 老师将他的技巧在分享出来,我认为有两点对我有帮助:
    1.对典型的题目进行分类,按算法和数据结构进行划分
    2.针对场景设计了通用的框架,然后再按题意填充细节。

    那在挑战计划中是怎么落实的?
    每周每天都会有对应的主题,我每天都坚持去做去归纳。
    不断地从抽象到具体,从模板到实现。

    第一周,数组,涉及到前缀和、回文串、二分查找、滑动窗口
    学会了前缀和的实现,无非是适合用前缀数组,用空间换时间;
    学会了通过方法的映射,题目可以转换为二分查找;
    学会了快慢指针、左右指针,可以实现数组和链表的快速查找。

    第二周的链表、队列、栈、二叉树,涉及到单调队列、二叉树、BFS、并查集;
    学会了二叉搜索树的递归是如此简单;
    学会了BFS搜索套路,栈加上同层遍历;
    学会了并查集的实现。

    第三周的数据结构设计、回溯、递归更是重头戏。
    学会了回溯的实现,就是递归加循环;
    学会了动态规划的转移方程,通过归纳可以得出;
    学会了LRU和LFU的套路。