NOTE
除法求值
使用带权并查集计算变量之间的除法关系。
这是历史学习笔记,可能存在过时或不完整的理解。
1. 题目描述
给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。
另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ? 的结果作为答案。
2. 思路
- 并查集
3. 实现
3.1. 并查集
func calcEquation(equations [][]string, values []float64, queries [][]string) []float64 {
// 给方程组中的每个变量编号
id := map[string]int{}
for _, eq := range equations {
a, b := eq[0], eq[1]
if _, has := id[a]; !has {
id[a] = len(id)
}
if _, has := id[b]; !has {
id[b] = len(id)
}
}
fa := make([]int, len(id))
w := make([]float64, len(id))
for i := range fa {
fa[i] = i
w[i] = 1
}
var find func(int) int
find = func(x int) int {
if fa[x] != x {
f := find(fa[x])
w[x] *= w[fa[x]]
fa[x] = f
}
return fa[x]
}
merge := func(from, to int, val float64) {
fFrom, fTo := find(from), find(to)
w[fFrom] = val * w[to] / w[from]
fa[fFrom] = fTo
}
for i, eq := range equations {
merge(id[eq[0]], id[eq[1]], values[i])
}
ans := make([]float64, len(queries))
for i, q := range queries {
start, hasS := id[q[0]]
end, hasE := id[q[1]]
if hasS && hasE && find(start) == find(end) {
ans[i] = w[start] / w[end]
} else {
ans[i] = -1
}
}
return ans
}
讨论
使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看