如何系统的学习算法和数据结构

线上课程

  • 预习 - 基础知识自己预习和查看
  • 课堂互动 - 跟着我一起思考、回答问题
  • 课后作业 - 按照切题方法

期待效果

  • 职业顶尖级别 - 对于算法和数据结构的理解
  • 一线互联网公司面试
  • LeetCode 300+ 的积累

《Outliers》- 《异类:不一样的成功启示录》

  • Chunk it up 切碎知识点
  • Deliberate Practicing 刻意练习
  • Feedback 反馈

Chunk it up

  • 庖丁解牛(将整个数据结构和算法进行拆解)
  • 脉络连接(拆解出来的每一块要与其他的有关联)

数据结构

  • 一维
    • 基础:数组 array (string),链表 linked list
    • 高级:栈 stack,队列 queue,双端队列 deque,集合 set,映射 map ( hash or map ),etc
  • 二维
    • 基础:树 tree,图 graph
    • 高级:二叉搜索树 binary search tree ( red-black tree,AVL ),堆 heap,并查集 disjoint set,字典树 Trie,etc
  • 特殊(工程中特殊的场景)
    • 位运算 Bitwise,布隆过滤器 BloomFilter
    • LRU Cache

算法

  • 三大基石:任何的数据结构和算法,最后都会转化为下面三者之一。算法的根本就是找到它的重复单元。
    • if-else,switch -> branch
    • for,while loop -> Iteration
    • 递归 Recursion(Divide & Conquer,Backtrace)
  • 高级算法
    • 搜索 Search:深度优先搜索 Depth first search,广度优先搜索 Breadth first,A*,etc
    • 动态规划 Dynamic Programming
    • 二分查找 Binary Search:对于一个有序的数组,很快地找到你要的目标节点
    • 贪心 Greedy
    • 数学 Math,几何 Geometry

注意:在头脑中回忆上面每种算法的思想和代码模板
**

Deliberate Practicing

  • 基本功:是区别业余和职业选手的根本
  • 刻意练习:过遍数(五遍刷题)
  • 练习缺陷、弱点的地方(不舒服、不爽、枯燥证明你在成长)

Feedback

  • 即时反馈
  • 主动型反馈(自己去找)
    • 高手代码(Github,LeetCode,etc.)
    • 第一视角直播
  • 被动式反馈(高手给你指点)
    • code review
    • 教练看你打,给你反馈

刷题技巧

切题四件套(单个题目)

  • Clarification(反复确认题目,与你理解的是相同的)
  • Possible solutions(想所有可能的解法,来解这个题目**)**
    • compare(time/space)
    • optimal(加强)
  • Coding
  • Test cases

无毒神掌(五遍刷题法)

第一遍

  • 5分钟:读题 + 思考(基础薄弱,最多 10 - 15 分钟)
  • 直接看解法:注意!多解法,比较解法优劣(上一步没有思路的话)
  • 背诵、默写好的解法

第二遍

  • 马上自己写(闭卷考试)-> leetcode 提交
  • 多种解法比较、体会 -> 优化!

第三遍

  • 过了一天后,再重复做题
  • 不同解法的熟练程度 -> 专项练习

第四遍

  • 过了一周:返回回来练习相同的题目

第五周

  • 面试前一周,恢复性训练(自己看时间,提前两周、半周都可以)

小结

  • 职业训练:拆分知识点、刻意练习、反馈
  • 五步刷题法(无毒神掌)
  • 做算法题的最大误区:只做一遍