|
5 | 5 |
|
6 | 6 | ## 题目大意 |
7 | 7 |
|
8 | | -给定一个变量对数组 `equations` 和一个实数数组 `values` 作为已知条件,其中 `equations[i] = [Ai, Bi]` 和 `values[i]` 共同表示 `Ai / Bi = values[i]`。每个 `Ai` 或 `Bi` 是一个表示单个变量的字符串。 |
| 8 | +**描述**:给定一个变量对数组 $equations$ 和一个实数数组 $values$ 作为已知条件,其中 $equations[i] = [Ai, Bi]$ 和 $values[i]$ 共同表示 `Ai / Bi = values[i]`。每个 $Ai$ 或 $Bi$ 是一个表示单个变量的字符串。 |
9 | 9 |
|
10 | | -再给定一个表示多个问题的数组 `queries`,其中 `queries[j] = [Cj, Dj]` 表示第 `j` 个问题,要求:根据已知条件找出 `Cj / Dj = ?` 的结果作为答案。返回所有问题的答案。如果某个答案无法确定,则用 `-1.0` 代替,如果问题中出现了给定的已知条件中没有出现的表示变量的字符串,则也用 `-1.0` 代替这个答案。 |
| 10 | +再给定一个表示多个问题的数组 $queries$,其中 $queries[j] = [Cj, Dj]$ 表示第 $j$ 个问题,要求:根据已知条件找出 `Cj / Dj = ?` 的结果作为答案。 |
| 11 | + |
| 12 | +**要求**:返回所有问题的答案。如果某个答案无法确定,则用 $-1.0$ 代替,如果问题中出现了给定的已知条件中没有出现的表示变量的字符串,则也用 $-1.0$ 代替这个答案。 |
| 13 | + |
| 14 | +**说明**: |
| 15 | + |
| 16 | +- 未在等式列表中出现的变量是未定义的,因此无法确定它们的答案。 |
| 17 | +- $1 \le equations.length \le 20$。 |
| 18 | +- $equations[i].length == 2$。 |
| 19 | +- $1 \le Ai.length, Bi.length \le 5$。 |
| 20 | +- $values.length == equations.length$。 |
| 21 | +- $0.0 < values[i] \le 20.0$。 |
| 22 | +- $1 \le queries.length \le 20$。 |
| 23 | +- $queries[i].length == 2$。 |
| 24 | +- $1 \le Cj.length, Dj.length \le 5$。 |
| 25 | +- $Ai, Bi, Cj, Dj$ 由小写英文字母与数字组成。 |
| 26 | + |
| 27 | +**示例**: |
| 28 | + |
| 29 | +- 示例 1: |
| 30 | + |
| 31 | +```python |
| 32 | +输入:equations = [["a","b"],["b","c"]], values = [2.0,3.0], queries = [["a","c"],["b","a"],["a","e"],["a","a"],["x","x"]] |
| 33 | +输出:[6.00000,0.50000,-1.00000,1.00000,-1.00000] |
| 34 | +解释: |
| 35 | +条件:a / b = 2.0, b / c = 3.0 |
| 36 | +问题:a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? |
| 37 | +结果:[6.0, 0.5, -1.0, 1.0, -1.0 ] |
| 38 | +注意:x 是未定义的 => -1.0 |
| 39 | +``` |
| 40 | + |
| 41 | +- 示例 2: |
| 42 | + |
| 43 | +```python |
| 44 | +输入:equations = [["a","b"],["b","c"],["bc","cd"]], values = [1.5,2.5,5.0], queries = [["a","c"],["c","b"],["bc","cd"],["cd","bc"]] |
| 45 | +输出:[3.75000,0.40000,5.00000,0.20000] |
| 46 | +``` |
11 | 47 |
|
12 | 48 | ## 解题思路 |
13 | 49 |
|
| 50 | +### 思路 1:并查集 |
| 51 | + |
14 | 52 | 在「[等式方程的可满足性](https://leetcode.cn/problems/satisfiability-of-equality-equations)」的基础上增加了倍数关系。在「[等式方程的可满足性](https://leetcode.cn/problems/satisfiability-of-equality-equations)」中我们处理传递关系使用了并查集,这道题也是一样,不过在使用并查集的同时还要维护倍数关系。 |
15 | 53 |
|
16 | 54 | 举例说明: |
17 | 55 |
|
18 | | -- `a / b = 2.0`:说明 `a = 2b`,`a` 和 `b` 在同一个集合。 |
19 | | -- `b / c = 3.0`:说明 `b = 3c`,`b` 和 `c` 在同一个集合。 |
| 56 | +- `a / b = 2.0`:说明 $a == 2b$,$a$ 和 $b$ 在同一个集合。 |
| 57 | +- `b / c = 3.0`:说明 $b == 3c$,$b$ 和 $c$ 在同一个集合。 |
20 | 58 |
|
21 | | -根据上述两式可得:`a`、`b`、`c` 都在一个集合中,且 `a = 2b = 6c`。 |
| 59 | +根据上述两式可得:$a$、$b$、$c$ 都在一个集合中,且 $a == 2b == 6c$。 |
22 | 60 |
|
23 | | -我们可以将同一集合中的变量倍数关系都转换为与根节点变量的倍数关系,比如上述例子中都转变为与 `a` 的倍数关系。 |
| 61 | +我们可以将同一集合中的变量倍数关系都转换为与根节点变量的倍数关系,比如上述例子中都转变为与 $a$ 的倍数关系。 |
24 | 62 |
|
25 | 63 | 具体操作如下: |
26 | 64 |
|
27 | | -- 定义并查集结构,并在并查集中定义一个表示倍数关系的 `multiples` 数组。 |
28 | | -- 遍历 `equations` 数组、`values` 数组,将每个变量按顺序编号,并使用 `union` 将其并入相同集合。 |
29 | | -- 遍历 `queries` 数组,判断两个变量是否在并查集中,并且是否在同一集合。如果找到对应关系,则将计算后的倍数关系存入答案数组,否则则将 `-1` 存入答案数组。 |
| 65 | +- 定义并查集结构,并在并查集中定义一个表示倍数关系的 $multiples$ 数组。 |
| 66 | +- 遍历 $equations$ 数组、$values$ 数组,将每个变量按顺序编号,并使用 `union` 将其并入相同集合。 |
| 67 | +- 遍历 $queries$ 数组,判断两个变量是否在并查集中,并且是否在同一集合。如果找到对应关系,则将计算后的倍数关系存入答案数组,否则则将 $-1$ 存入答案数组。 |
30 | 68 | - 最终输出答案数组。 |
31 | 69 |
|
32 | 70 | 并查集中维护倍数相关方法说明: |
|
36 | 74 | - `union` 方法: |
37 | 75 | - 如果两个节点属于同一集合,则直接返回。 |
38 | 76 | - 如果两个节点不属于同一个集合,合并之前当前节点的倍数关系更新,然后再进行更新。 |
39 | | -- `is_connect` 方法: |
40 | | - - 如果两个节点不属于同一集合,返回 `-1`。 |
| 77 | +- `is_connected` 方法: |
| 78 | + - 如果两个节点不属于同一集合,返回 $-1$。 |
41 | 79 | - 如果两个节点属于同一集合,则返回倍数关系。 |
42 | 80 |
|
43 | | -## 代码 |
| 81 | +### 思路 1:代码 |
44 | 82 |
|
45 | 83 | ```python |
46 | 84 | class UnionFind: |
@@ -109,3 +147,8 @@ class Solution: |
109 | 147 | return res |
110 | 148 | ``` |
111 | 149 |
|
| 150 | +### 思路 1:复杂度分析 |
| 151 | + |
| 152 | +- **时间复杂度**:$O((m + n) \times \alpha(m + n))$,$\alpha$ 是反 `Ackerman` 函数。 |
| 153 | +- **空间复杂度**:$O(m + n)$。 |
| 154 | + |
0 commit comments