《异类:不一样的成功启示录》 🗡→ 《Outliers:The Story of Success》 如果精通任何一个领域,三步走:
- Chunk It Up:切碎知识点
- Deliberate Practicing:刻意练习
- FeedBack:反馈
01. Chunk It Up:切碎知识点
包丁解牛 -> 脉络相连(任何一个知识体系都是一棵树,人脑不适合记忆和理解孤立的知识)
- 一维数据结构
- 基础性 -> 数组【array】【string】、链表【linked list】
- 高级 -> 栈【stack】、队列【queue】、双端队列【deque】、集合【set】、映射【map(hash or map)】
- 二维数据结构
- 基础 -> 树【tree】、图【graph】etc…
- 高级 -> 二叉搜索树【binary search tree】(red-black tree、AVL)、堆【heap】、并查集【disjoint set】、字典树【Trie】 etc…
特殊数据结构
if-else, switch -> branch 跳转语句
- for , while loop -> Iteration 循环语句
递归 Recursion(Divide & Conquer, Backtrace) 函数自我调用
以上三种基础算法是所有数据结构和算法的基石。所有复杂的算法,最后其实都是在**找它的重复单元
搜索 Search: 深度优先搜索(Depth first Search);广度优先搜索(Breadth first Search);启发式搜索A*
- 动态规划 Dynamic Programming
- 二分查找 Binary Search
- 贪心算法 Greedy
- 数学 Math,几何 Geometry
5种高级算法 注意:在头脑中会议上面每种的算法思想和代码模板
02. Deliberate Practicing:刻意练习(过遍数)
- 基本功是区分业余和职业选手的根本
- 基础动作的分解训练和反复练习 -> 最大的误区:题目只做一遍
- 练习弱项、缺陷的地方
2.1 切题方法
- Clarification : 看清题目
- Possible Solutions:想到该题所有可能的解法,比较不同方法的时空复杂度
- compare(time/ space)
- optimal(优化、加强)
- Coding(多写)
- Test cases(测试样例通过)
2.2 五步刷题法
当拿到一个新题的时候:
- 5分钟:读题 + 思考
- 直接看解法:注意!多种解法,比较解法的优劣
- 背诵、默写算法
刷题第二遍:
- 马上自己写 -> LeetCode 提交
- 多种解法比较、体会 -> 优化自己的算法
刷题第三遍:
- 过了一天之后,在重复做题
- 不同解法的熟练程度 —> 进行专项训练
刷题第四遍:
- 一周过后:反复回来练习相同的题目
刷题第五遍:
- 即时反馈
- 主动型反馈
- 高手代码(GitHub LeetCode etc…)
- 第一视角直播
- 被动式反馈
- 高人指点
- code review
总结
- 职业训练:拆分知识点、刻意练习、反馈
- 五步刷题法
- 做算法题目的最大误区:只做一遍