【算法笔记】极客时间 算法面试通关40讲 笔记 覃超
[算法笔记]极客时间 算法面试通关40讲 覃超
- 【算法笔记】极客时间 算法面试通关40讲 覃超
- 相关链接
- 在leetcode 上的题号
- 数组、链表:
- (堆)栈stack、队列queue
- 优先队列
- 哈希表: map 和 set 映射和集合
- 树,图、二叉(搜索)树
- 二叉树的遍历
- 递归,分治
- 贪心 greedy
- 广度,深度优先搜索
- 剪枝
- 二分查找
- Trie树,又称 字典树 单词查找树
- 位运算
- 动态规划(动态地推)
- 并查集
- LRU cache
- Bloom Filter
【算法笔记】极客时间 算法面试通关40讲 覃超
相关链接
- 课程链接(付费):https://time.geekbang.org/course/intro/130
- 部分PPT: [https://github.com/s32n/algorithm](https://github.com/ s32n/algorithm)
- 代码链接:
- 别人的总结:算法面试通关40讲-总结
在leetcode 上的题号
数组、链表:
206 . 反转链表 √
24 . 两两交换链表中的节点 √
141 . 环形链表 √
142 . 环形链表 II
25 . K个一组翻转链表
(堆)栈stack、队列queue
注意:
堆是另一种数据结构,
不会让手写,每个语言都自己有实现。
栈:先入先出FILO,压栈出栈
队列:先入先出FIFO
常见数据结构操作的时间复杂度:
(栈和队列的插入删除查找的时间复杂度是相同的)
常见算法的时间复杂度如下:
20 . 有效的括号 √
21 . 用栈实现队列 √
225 . 用队列实现栈 √
优先队列
实现机制:
- 用堆: 二叉堆 多项式堆 斐波那契堆
- 二叉搜索树
小顶堆,越小的越排在前面,最小的在最顶部。
大顶堆 同理,根节点最大。
维基百科 :heap wiki 堆
下图可知,最简单的二叉堆性能不好。严格斐波那契堆 性能较好。
703 . 数据流中的第K大元素 √
239 . 滑动窗口最大值 √ 难理解啊
使用 python 直接调用现成的heapq 堆排列实现,最小堆实现
滑动窗口问题,双端队列。
705 . 粉碎糖果 kth-largest-element-in-a-stream
706 . 滑动窗口最大值
哈希表: map 和 set 映射和集合
哈希表:映射表一样的东西,方便快速查找。
哈希函数:将所有的转(取模)到一个表中找到,表的索引通过 哈希函数计算出来。
哈希碰撞: 数据的数量大于表的长度时,就一定会冲突,公用同一个模具。
hashmap 和 hashset :插入删除查找O(1),但存储数据无序.
treemap 和 treeset :插入删除查找O(logN),但存储数据有序.
python 字典默认的就是 hashmap 实现的。
242 . 有效的字母异位词 √
1 . 两数之和 √
15 . 三数之和. √ 难点
18 . 四个数之和
树,图、二叉(搜索)树
大概念:
树子
二叉树(面试最常见)
二叉搜索树
小概念:
父亲节
孩子节点
左右孩子
根节点
二叉树
完全二叉树
链是特殊化的树
树是特殊化的图
图 地图走路径最短时会使用到。(面试很少考到)
二叉搜索树,又称为 有效二叉树、排序二叉树,空树也是二叉搜索树。具备如下性质:
- 左子树所有的节点的值均小于它的根节点的值。
- 右子树所有的结点的值均大于它的根节点的值;
- 递归,左右子树也都满足上面的条件。
(
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
)
注意:
不是左右孩子直接比较,还需要根节点的参与。
中序遍历后是升序的。
特点:
5. 平均的搜索插入删除的时间复杂度是 O(logN)
6. 最差时,二叉树是单边的,为O(N),称为 退化。
针对最差情况改良后的树有,
平衡二叉搜索树(如红黑树,AVL树 splay树)
他们在最坏情况下的都是O(logN)的,平均也是O(logN)
python java 中标准库实现的二叉树都是用红黑树实现的。
6 . 验证二叉搜索树 √
236 . 二叉树的最近公共祖先 √
235 . 二叉搜索树的最近公共祖先 √
二叉树的遍历
前、中、后序遍历(实际使用的少,用的多的是深度广度优先搜索)
二叉搜索数的中序遍历 结果是 升序的。
python 递归实现如下:
递归,分治
递归是深度优先搜索的基础
递归:函数自己调用自己。
递归出口
n! 阶乘的递归实现:
def Factorial(n):if n == 1: return 1return n * Factorial(n-1)
递归模板:
# level 标记所在的层级,是否在递归中,第几层
def recursion(level, param1, param2, ....):# 递归出口 一般放在开始if level > MAX_LEVEL: #递归出口print_resutreturn # 当前层需要处理的事情 程序逻辑 业务逻辑process_data(level, data ...) # 当前任务处理# 进入下一层, p1 表示给下一层的参数可能改变了self.recursion(level+1,p1,p2,...) # 递归# 出来之后,可能需要做的一些事,不一定需要有。reverse_state(level) # 可能有的后续事情
斐波那契数列:递归实现会有大量的重复,子模块。
分治算法: divide & conquer
分治可以并行计算,如果有中间结果就不能用分治,可以用动态规划。
分治算法模板:(分治算法是通过递归实现的,知识需要将问题分解成小问题)
def divide_conquer(problem, param1, param2, ..):# problem 当前需要处理的问题。# 递归出口if problem is None:print_reseutreturn# 准备当前问题需要的数据data = prepare_data(problem)# 将大问题分成小问题subproblems = split_problem(problem, data)# 分别解决小问题subresults1 = self.divide_conquer(subproblems[0],p1, ..)subresults2 = self.divide_conquer(subproblems[1],p1, ..)subresults3 = self.divide_conquer(subproblems[2],p1, ..)# 利用子问题的结果来解决 当前的大问题。result = process_result(subresult1, subresult2, result3,..)
50 . Pow(x, n) √
169 . 多数元素 √
贪心 greedy
贪心:首选最大,最多的。解决问题的数量有限。
考的较少。
因为:当前最佳,通常不是全局最佳。
适用场景:
- 可分成子问题解决;
- 子问题的最优能推到最终问题的最优解;
与动态规划的不同:
贪心对每个子问题都做出选择,不能回退。
动态规划会 保存之间运算的结果,并根据需要选择,可以回退。
122 . 买卖股票的最佳时机 II √
广度,深度优先搜索
在树、图、状态集中寻找特定的节点。
广度优先搜索:BFS
滴波浪的感觉,一层一层的处理。
每一次都遍历儿子。
图的广度优先搜索代码:
BFS树的时候不用 viisited,因为不会可能重复访问的情况。
广度有限搜索是非递归的,需要手动实现。
def BFS(graph, start, end):quece = [] # 存放BFS后的顺序quece.append([start])visited.add(start) # 存放已经访问过的节点while graph: # 有内容就继续访问node = graph.pop() # 拿出来viisited.add(node) # 添加进去,表示已经访问过了process(node) # 进行操作# 找没有被访问过的,node 的后继节点nodes = generate_related_nodes(node)queue.push(nodes).....
没有理解这个??????代码
广度优先,人更容易理解,代码难写。
深度优先搜索,代码好些,有回溯的思想(不太好理解)。回溯根,没有可以前进的方向时,就停止。
深度有限是递归实现,代码好写。
visited =set()
def dfs(node, visited):visited.add(node)# 这里添加处理当前节点的程序......for next_node in node.children():if not next_node in visited:dfs(next_node, visited)
102 . 二叉树的层次遍历 √
104 . 二叉树的最大深度 √
111 . 二叉树的最小深度 √
22 . 括号生成 √
剪枝
搜索中有的分支是没有必要的,就不用去判断了。
51 . N皇后
52 . N皇后 II
36 . 有效的数独
37 . 解数独
二分查找
对数列的要求:
- 单调的
- 存在上下界
- 能够通过索引访问其中的元素
数组适合,链表非常不适合。
假设数列是 递增升序的,需要从其中找到 target。
时间复杂度是 O(logN)
下面的代码背下来:
left, right = 0, len(array)-1
while left <= right:mid = (left + right) / 2if array[mid] == target:return resultelif array[mid] < target:left = mid + 1 else:right = mid - 1
69 . x 的平方根 √
Trie树,又称 字典树 单词查找树
查询效率比哈希表高。
用边来存放字母,叶子节点存放单词。
空间换时间。
基本性质:
1 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
2 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
3 每个节点的所有子节点包含的字符都不相同。
208. 实现 Trie (前缀树)
212. 单词搜索 II
位运算
191. 位1的个数
231 . 2的幂
338 . 比特位计数
52 . N皇后 II
动态规划(动态地推)
- 递归 + 记忆(搜索) --> (动态)递推(自下向上的递推)
- 状态的定义:opt[n], dp[n], fib[b]
- 状态转移方程:opt[n] = best_of(opt[n-1], opt[n-1], …)
- 最优子结构
斐波那契数列,实现的过程中要记住已经计算出的结果。
def fib(n):return n if n<= 1 else fib(n-1)+fib(n-2)
DP vs 回溯(递归) vs 贪心
回溯(递归) - 有重复计算
贪心 - 永远局部最优
DP - 记录局部最优子结构、多种记录值
63 . 不同路径 II
70 . 爬楼梯
120 . 三角形最小路径和
152 . 乘积最大子序列
121 . 买卖股票的最佳时机
122 . 买卖股票的最佳时机 II
123 . 买卖股票的最佳时机 III
188 . 买卖股票的最佳时机 IV
714 . 买卖股票的最佳时机含手续费
309 . 最佳买卖股票时机含冷冻期
300 . 最长上升子序列
522 . 最长特殊序列 II
72 . 编辑距离
并查集
200 . 岛屿数量
547 . 朋友圈
LRU cache
146 . LRU缓存机制
Bloom Filter
【算法笔记】极客时间 算法面试通关40讲 笔记 覃超相关推荐
- [极客时间]《算法面试通关40讲》
算法面试通关40讲 第1课 算法与数据结构 1.1麦穗理论 1.2 硅谷工作 1.3 比特币结构 单向链表 每一个交易的记录是二叉树,这样存的好处是 只要根据根节点就可以查询到所有的节点之和是否被篡改 ...
- 极客时间-算法训练营1.2 实战题目解析:移动零
一 序 本文属于极客时间-算法训练营 学习笔记系列. 二 刷题步骤 第一遍 五分钟:读题 + 思考 直接看解法:多看几种,比较解法优劣 背诵.默写好的解法 第二遍 马上自己写 --> Leetc ...
- 极客时间_软件设计之美 笔记
极客时间_软件设计之美 笔记 1.软件设计是什么 写代码前应该有模型设计 比如mvc结构就是一种模型 代码应该有规范, 产品内部原则 避免每个开发按自己的想法实现,有人写rest 有人写mvc 代码模 ...
- 极客时间-如何设计一个秒杀系统-笔记0到2章
极客时间-如何设计一个秒杀系统-笔记0到2章 0.开篇词-系统秒杀系统架构设计都有哪些关键点? 1.设计秒杀系统时应该注意的5个架构原则 1.数据要尽量少 2.请求数要尽量少 3.路径要尽量少 4.依 ...
- 笔记1 第11课 贪心初步 ——柠檬水找零,分发饼干,跳跃游戏,完成所有任务所需最小能量——极客时间算法
之前收藏了极客时间的算法训练营3期 共21课,计划每一课写博客来记录学习,主要形式为 方法类型1 题1 题解 题2 题解 方法类型2 题1 题解 -- 题目大体来自leetcode 和 acwing ...
- 笔记1 第13课 动规2 ——买卖股票最佳时机,打家劫舍,零钱找兑——极客时间算法
之前收藏了极客时间的算法训练营3期 共21课,计划每一课写博客来记录学习,主要形式为 方法类型1 题1 题解 题2 题解 方法类型2 题1 题解 -- 题目大体来自leetcode 和 acwing ...
- 极客时间算法练习题总结
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 在极客时间<数据结构和算法之美>最后,王争老师加餐了7天训练内容,对每一部分需要掌握的数据结 ...
- 极客时间-算法面试40讲
一.合格程序员第一步:算法 1.编程的内功修炼 2.去国内一流互联网公司的必要条件 3.硅谷互联网公司面试更是要求当场写算法题目 1.电话面试 2.现场手撕代码 4.算法和数据结构是有趣且实用 区块链 ...
- 极客时间-算法训练营-第二周
文章目录 学习笔记 1.哈希表 定义 图示 具体实现是Map和Set HashSet源码分析 HashMap源码分析 时间复杂度 实战题目 [242. 有效的字母异位词](https://leetco ...
最新文章
- DeepFaceLab史上最快的环境搭建(虚拟环境)
- SQL中关联表并使用子表的COUNT和SUM函数作为扩展字段
- CG CTF WEB SQL Injection
- 图解Sharepoint2007部署(下):安装sharepoint2007、创建sharepoint2007站点
- matlab能流图,有会用MATLAB写海流图的程序吗
- vtiger6.0升级汇总
- 《剑指offer》面试题21——包含min函数的栈(C++)
- 九宫格图片上传可展示,可删除,可添加功能
- python绘制条形图例题_[宜配屋]听图阁 - Python+matplotlib+numpy绘制精美的条形统计图...
- 适用于中小型公司代理服务器的IPTABLES脚本
- 【微信小程序|组件库】一款清新且简洁的卡片样式
- Mon Aug 29 00:25:18 2016 Suspending MMON slave action kewrmafsa_ for 82800 seconds
- Debian10.6 Xfce 系统安装教程
- android: 禁止多点触控
- 如何停止线程?stop方法过时弊端
- mpls工作原理通俗解释_网工知识角|三分钟让你醍醐灌顶,熟练掌握MPLS技术
- DNS无法解析IP_DNS之基本原理
- 工业过程控制领域中通信
- Tesseract中文语言包 chi_sim.traineddata,免费下载 而且还是最新的
- Bootstrap 组件:面板组件(panel)
热门文章
- 彻底了解DVD:从入门到精通(二)[转]
- es module 和 commonjs 模块化实践
- FPGA实现的SPI协议(二)----基于SPI接口的FLASH芯片M25P16的使用
- 往事如烟 - 老钟11
- csv文件导入后台乱码_教师使用Excel打开csv文件出现乱码怎么办-Leo老师
- python中的os.listdir()方法、os.path.isdir()方法
- PAT(乙级)2022年夏季考试
- 冒泡算法的Java实现
- OpenFlow网络基本介绍
- 【问题】vcenter7升级遇到“Exception in invoking authentication handler unidentifiable C++ exception”