目录
算法 - 并查集 Union Find
主要思想
Union:合并2个元素为1个根节点 Union(x,y)
Find:找到某个元素的根节点 Find(x)
算法模板
class UnionFind:
# 初始化
def __init__(self):
self.root = [-1]*(row*col):
for i in range(row*col):
self.root[i] = i
def find(self,x):
if x == self.root[x]:
return self.root[x]
else:
self.find(self.root[x])
return
def union(self,x,y):
rootX = self.find(x)
rootY = self.find(y)
if rootX != rootY:
self.root[rootX] = rootY
算法优化
Quick Find
class UnionFind:
def __init__(self):
self.root = [-1]*(row*col):
for i in range(row*col):
self.root[i] = i
def find(self,x):
if x == self.root[x]:
return self.root[x]
else:
self.root[x] = self.find(self.root[x])
return self.root[x]
def union(self,x,y):
rootX = self.find(x)
rootY = self.find(y)
if rootX != rootY:
self.root[rootX] = rootY
Quick Union - 权重
思想:防止树太高
原理:比较两个树的高度,把矮的树连接到高的树上,使新树的高度最小
class UnionFind:
def __init__(self):
self.root = [-1]*n:
self.rank = [0]*n
for i in range(n):
self.root[i] = i
def find(self,x):
if self.root[x] != x:
self.root[x] = self.find(self.root[x])
return self.root[x]
def union(self,x,y):
rootX = self.find(x)
rootY = self.find(y)
if rootX != rootY:
if self.rank[rootX] > self.rank[rootY]:
root[rootY] = rootX
elif self.rank[rootX] < self.rank[rootY]:
root[rootX] = rootY
else:
root[rootY] = rootX
self.rank[rootX] += 1
算法 - 贪心算法 Greedy
核心思想
每一步的选择都是当前看起来的最优解,换言之,只是局部最优解,而不是整体最优解。
算法 - 记忆化搜索(备忘录)Memorization
目的
减少重复计算
应用
斐波那契数列:该数列的特点是 F(n) = F(n-1) + F(n-2),需要用到递归。可用一个数组,初始值全是 -1,当某个 F(n) 的值已被计算过,就将该值存至 list [n]。后面再次用到 F(n) 时,若 list [n] 不是 -1,就直接调用该值,不需要再重复计算了。
算法 - 动态规划
特点
题型千变万化,思路千变万化
三个要素
初始状态,状态转移方程式,终止状态
步骤
由初始状态,通过状态转移方程式,计算出所有中间状态,从而计算出终止状态
应用
1.计数:有多少种方式 / 方法
机器人从左上角到右下角有多少个路径
2.求最值:最大值 / 最小值
每个格子上都有一个数字,机器人从左到右路径的最大数字和
3.求存在性:是否存在某个可能
每个格子上都有一个指向,是否存在机器人从左到右的路径
数据结构 - 字典树 / 前缀树 Trie
应用
百度的关键字自动匹配
时间复杂度
# 写一个自动匹配的程序:普通方法,不是Trie
数组:[goog,googl,google,bai,baidu,gi]
g:goog,googl,google,gi
go:goog,googl,google
# 插入:O(N)
# 搜索:O(N)
# 检查前缀是否存在:O(N*M),N是数组的元素个数,M是每次匹配时的时间复杂度
要素
root 节点:root = Trie()
孩子节点:HashMap(key 是字符,value 是新的 Trie)
结束 Flag:boolean isEnd
对应的值:String val
知识点回顾