《异类:不一样的成功启示录》 🗡→ 《Outliers:The Story of Success》 如果精通任何一个领域,三步走:

  1. Chunk It Up:切碎知识点
  2. Deliberate Practicing:刻意练习
  3. FeedBack:反馈

01. Chunk It Up:切碎知识点

包丁解牛 -> 脉络相连(任何一个知识体系都是一棵树,人脑不适合记忆和理解孤立的知识)

  1. 一维数据结构
    1. 基础性 -> 数组【array】【string】、链表【linked list】
    2. 高级 -> 栈【stack】、队列【queue】、双端队列【deque】、集合【set】、映射【map(hash or map)】
  2. 二维数据结构
    1. 基础 -> 树【tree】、图【graph】etc…
    2. 高级 -> 二叉搜索树【binary search tree】(red-black tree、AVL)、堆【heap】、并查集【disjoint set】、字典树【Trie】 etc…
  3. 特殊数据结构

    1. 位运算【Bitwise】、布隆过滤器 【BloomFilter】
    2. 缓存【LRU Cache】

      八种算法

  4. if-else, switch -> branch 跳转语句

  5. for , while loop -> Iteration 循环语句
  6. 递归 Recursion(Divide & Conquer, Backtrace) 函数自我调用

    以上三种基础算法是所有数据结构和算法的基石。所有复杂的算法,最后其实都是在**找它的重复单元

  7. 搜索 Search: 深度优先搜索(Depth first Search);广度优先搜索(Breadth first Search);启发式搜索A*

  8. 动态规划 Dynamic Programming
  9. 二分查找 Binary Search
  10. 贪心算法 Greedy
  11. 数学 Math,几何 Geometry

    5种高级算法 注意:在头脑中会议上面每种的算法思想和代码模板

数据结构.xmind

算法脑图.xmind

02. Deliberate Practicing:刻意练习(过遍数)

  • 基本功是区分业余和职业选手的根本
  • 基础动作的分解训练和反复练习 -> 最大的误区:题目只做一遍
  • 练习弱项、缺陷的地方

2.1 切题方法

  1. Clarification : 看清题目
  2. Possible Solutions:想到该题所有可能的解法,比较不同方法的时空复杂度
    1. compare(time/ space)
    2. optimal(优化、加强)
  3. Coding(多写)
  4. Test cases(测试样例通过)

2.2 五步刷题法

当拿到一个新题的时候:

  1. 5分钟:读题 + 思考
  2. 直接看解法:注意!多种解法,比较解法的优劣
  3. 背诵、默写算法

刷题第二遍:

  1. 马上自己写 -> LeetCode 提交
  2. 多种解法比较、体会 -> 优化自己的算法

刷题第三遍:

  1. 过了一天之后,在重复做题
  2. 不同解法的熟练程度 —> 进行专项训练

刷题第四遍:

  1. 一周过后:反复回来练习相同的题目

刷题第五遍:

  1. 面试前一到两周进行恢复性训练

    03. Feedback:反馈

  • 即时反馈
  • 主动型反馈
    • 高手代码(GitHub LeetCode etc…)
    • 第一视角直播
  • 被动式反馈
    • 高人指点
    • code review

总结

  1. 职业训练:拆分知识点、刻意练习、反馈
  2. 五步刷题法
  3. 做算法题目的最大误区:只做一遍