3528. 单位转换 I
题目描述
有 n
种单位,编号从 0
到 n - 1
。给你一个二维整数数组 conversions
,长度为 n - 1
,其中 conversions[i] = [sourceUniti, targetUniti, conversionFactori]
,表示一个 sourceUniti
类型的单位等于 conversionFactori
个 targetUniti
类型的单位。
请你返回一个长度为 n
的数组 baseUnitConversion
,其中 baseUnitConversion[i]
表示 一个 0 类型单位等于多少个 i 类型单位。由于结果可能很大,请返回每个 baseUnitConversion[i]
对 109 + 7
取模后的值。
示例 1:
输入: conversions = [[0,1,2],[1,2,3]]
输出: [1,2,6]
解释:
- 使用
conversions[0]
:将一个 0 类型单位转换为 2 个 1 类型单位。 - 使用
conversions[0]
和conversions[1]
将一个 0 类型单位转换为 6 个 2 类型单位。

示例 2:
输入: conversions = [[0,1,2],[0,2,3],[1,3,4],[1,4,5],[2,5,2],[4,6,3],[5,7,4]]
输出: [1,2,3,8,10,6,30,24]
解释:
- 使用
conversions[0]
将一个 0 类型单位转换为 2 个 1 类型单位。 - 使用
conversions[1]
将一个 0 类型单位转换为 3 个 2 类型单位。 - 使用
conversions[0]
和conversions[2]
将一个 0 类型单位转换为 8 个 3 类型单位。 - 使用
conversions[0]
和conversions[3]
将一个 0 类型单位转换为 10 个 4 类型单位。 - 使用
conversions[1]
和conversions[4]
将一个 0 类型单位转换为 6 个 5 类型单位。 - 使用
conversions[0]
、conversions[3]
和conversions[5]
将一个 0 类型单位转换为 30 个 6 类型单位。 - 使用
conversions[1]
、conversions[4]
和conversions[6]
将一个 0 类型单位转换为 24 个 7 类型单位。
提示:
2 <= n <= 105
conversions.length == n - 1
0 <= sourceUniti, targetUniti < n
1 <= conversionFactori <= 109
- 保证单位 0 可以通过 唯一 的转换路径(不需要反向转换)转换为任何其他单位。
解法
方法一:DFS
由于题目保证了单位 0 可以通过唯一的转换路径转换为其他单位,因此我们可以使用深度优先搜索(DFS)来遍历所有单位的转换关系。另外,由于 \(\textit{conversions}\) 数组的长度为 \(n - 1\),表示有 \(n - 1\) 条转换关系,因此我们可以将单位转换关系看作一棵树,根节点为单位 0,其他节点为其他单位。
我们可以用一个邻接表 \(g\) 来表示单位转换关系,其中 \(g[i]\) 表示单位 \(i\) 可以转换到的单位和对应的转换因子。
然后,我们从根节点 \(0\) 开始进行深度优先搜索,即调函数 \(\textit{dfs}(s, \textit{mul})\),其中 \(s\) 表示当前单位,\(\textit{mul}\) 表示从单位 \(0\) 转换到单位 \(s\) 的转换因子。初始时 \(s = 0\), \(\textit{mul} = 1\)。在每次递归中,我们将当前单位 \(s\) 的转换因子 \(\textit{mul}\) 存储到答案数组中,然后遍历当前单位 \(s\) 的所有邻接单位 \(t\),递归调用 \(\textit{dfs}(t, \textit{mul} \times w \mod (10^9 + 7))\),其中 \(w\) 为单位 \(s\) 转换到单位 \(t\) 的转换因子。
最后,我们返回答案数组即可。
时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。其中 \(n\) 为单位的数量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|