算法训练营前言
算法训练营学习笔记
摒弃“旧习惯”-最重要
- 不要死磕(传统方式)
- 使用五毒神掌(敢于放手、敢于死记硬背代码)
- 不懒于看高手的代码(国际版的高票答案)
- 最佳方式:5分钟想不出来,直接看题解或者高票代码,用五毒神掌变成自己的东西。这个过程:觉得自己很菜甚至有点自卑,但是有借势而起的感觉。
- 最差方式:看到题目想自己单挑一下,不借助外部帮助自己解决;以为15~30分钟就可以搞定,谁知道死磕了2~3个小时或者一晚上,终于“通过”。精疲力竭,没有精力学习高票程序黛安,就开始做下一题(或放弃)。
Overall View
如何精通一个领域
Chunk it up
分解:将整体划分成一个个独立的小部分
连接:将每个独立的知识点进行连接
效果:庖丁解牛,游刃有余,了然于胸,运筹帷幄做理性的决策。
Musk: One bit of advice: it is important to view knowledge as sort of a semantic tree -- make sure you
understand the fundamental principles, ie hte trunk and big branchese, before you get into the leaves/details
or there is nothing for them to hang on to.
主干和主分支
数据结构:
- 一维
- 基础:数组array/string, 链表linked list
- 高级:栈stack, 队列queue, 双端队列deque, 集合set, 映射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 Search, A*, etc
- 动态规划 Dynamic Programming
- 二分查找 Binary Search
- 贪心Greedy
- 数学Math, 几何Geomitry
tip: 在头脑中回忆上面每种算法的思想和代码模版
Deliberate Practicing
基本功
基础动作的分解训练和反复练习 --> 过遍数 --> 五遍刷题法(五毒神掌)
练习缺陷,弱点地方,会经历不舒服,不爽,枯燥 ---> 舒适区
Feedback
- 即时反馈
- 主动型反馈
- 高手代码(GitHub,LeetCode, etc)
- Faker第一视角直播
- 被动式反馈(高手给你指点)
- code review
切题四件套
- Clarification 明确题意
- Possible solutions
- compare (time/space)
- optimal (加强)
- Coding
- Test cases
五毒神掌
刷题第一遍
- 5分钟:读题 + 思考
- 直接看解法:注意不要死扣钻牛角尖! 多解法,比较解法优劣。
- 背诵默写
刷题第二遍
- 马上自己写 --> LeetCode 提交
- 多种解法比较,体会 --> 优化!
刷题第三遍
- 过了一天后,再重复做题
- 不同解法的熟练程度 --> 专项练习
刷题第四遍
过了一周:反复回来联系相同题目
刷题第五遍
- 面试前一周恢复性训练
指法和小操作
- fn + delete 删除光标右侧
- Home, end (行头,行尾) command
- option + left/right 光标按单词切分
- option + delete 删除单词
- shift + command + right 选中整行 (光标在行头时)
- Top tips for
Big O notation
O 表示 它的复杂度是关于n的怎样的一个函数。
时间复杂度(看执行次数)
- O(1): Constant Complexit 常数复杂度
- O(log n): Logarithmic Complexity 对数复杂度
- O(n): Linear Complexity 线性时间复杂度
- O(n^2): N square Complexity 平方
- O(n^3): N cubic Complexity 立方
- O(2^n): Exponential Growth 指数
- O(n!): Factorial 阶乘
时间复杂度曲线

主定理
用来解决所有递归的函数,计算这些函数的时间复杂度。
- Binary Search: O(logn)
- Binary tree traversal: O(n) -> 每个节点会访问一次且仅访问一次
- Optimal sorted matrix search: O(n)
- Merge sort: O(nlogn)
思考题
- 二叉树遍历 -前序、中序、后序:时间复杂度是多少?
- 图的遍历:时间复杂度是多少?
- 搜索算法:DFS、BFS时间复杂度是多少?
- 二分查找:时间复杂度是多少?
不会的话去看视频:预习2.2
时间复杂度
- 数组的长度
- 递归的深度
Tips
- 对自己程序的时间和空间复杂度能够清晰的算出来;并且要养成习惯,写完之后能够分析出这段程序的时间和空间复杂度。
- 对自己要有一定的要求,能够用最简洁的时间和空间复杂度完成这段代码,这是一个顶尖程序员的必备素养

浙公网安备 33010602011771号