3528. Unit Conversion I
Description
There are n
types of units indexed from 0
to n - 1
. You are given a 2D integer array conversions
of length n - 1
, where conversions[i] = [sourceUniti, targetUniti, conversionFactori]
. This indicates that a single unit of type sourceUniti
is equivalent to conversionFactori
units of type targetUniti
.
Return an array baseUnitConversion
of length n
, where baseUnitConversion[i]
is the number of units of type i
equivalent to a single unit of type 0. Since the answer may be large, return each baseUnitConversion[i]
modulo 109 + 7
.
Example 1:
Input: conversions = [[0,1,2],[1,2,3]]
Output: [1,2,6]
Explanation:
- Convert a single unit of type 0 into 2 units of type 1 using
conversions[0]
. - Convert a single unit of type 0 into 6 units of type 2 using
conversions[0]
, thenconversions[1]
.

Example 2:
Input: conversions = [[0,1,2],[0,2,3],[1,3,4],[1,4,5],[2,5,2],[4,6,3],[5,7,4]]
Output: [1,2,3,8,10,6,30,24]
Explanation:
- Convert a single unit of type 0 into 2 units of type 1 using
conversions[0]
. - Convert a single unit of type 0 into 3 units of type 2 using
conversions[1]
. - Convert a single unit of type 0 into 8 units of type 3 using
conversions[0]
, thenconversions[2]
. - Convert a single unit of type 0 into 10 units of type 4 using
conversions[0]
, thenconversions[3]
. - Convert a single unit of type 0 into 6 units of type 5 using
conversions[1]
, thenconversions[4]
. - Convert a single unit of type 0 into 30 units of type 6 using
conversions[0]
,conversions[3]
, thenconversions[5]
. - Convert a single unit of type 0 into 24 units of type 7 using
conversions[1]
,conversions[4]
, thenconversions[6]
.
Constraints:
2 <= n <= 105
conversions.length == n - 1
0 <= sourceUniti, targetUniti < n
1 <= conversionFactori <= 109
- It is guaranteed that unit 0 can be converted into any other unit through a unique combination of conversions without using any conversions in the opposite direction.
Solutions
Solution 1: DFS
Since the problem guarantees that unit 0 can be converted to any other unit through a unique conversion path, we can use Depth-First Search (DFS) to traverse all unit conversion relationships. Additionally, since the length of the \(\textit{conversions}\) array is \(n - 1\), representing \(n - 1\) conversion relationships, we can treat the unit conversion relationships as a tree, where the root node is unit 0, and the other nodes are the other units.
We can use an adjacency list \(g\) to represent the unit conversion relationships, where \(g[i]\) represents the units that unit \(i\) can convert to and the corresponding conversion factors.
Then, we start the DFS from the root node \(0\), i.e., call the function \(\textit{dfs}(s, \textit{mul})\), where \(s\) represents the current unit, and \(\textit{mul}\) represents the conversion factor from unit \(0\) to unit \(s\). Initially, \(s = 0\), \(\textit{mul} = 1\). In each recursion, we store the conversion factor \(\textit{mul}\) of the current unit \(s\) into the answer array, then traverse all adjacent units \(t\) of the current unit \(s\), and recursively call \(\textit{dfs}(t, \textit{mul} \times w \mod (10^9 + 7))\), where \(w\) is the conversion factor from unit \(s\) to unit \(t\).
Finally, we return the answer array.
The complexity is \(O(n)\), and the space complexity is \(O(n)\), where \(n\) is the number of units.
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 |
|