LeetCode 题解工作台

单位转换 I

有 n 种单位,编号从 0 到 n - 1 。给你一个二维整数数组 conversions ,长度为 n - 1 ,其中 conversions[i] = [sourceUnit i , targetUnit i , conversionFactor i ] ,表示一个 sourceUnit i 类…

category

3

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

中等 · 图·DFS·traversal

bolt

答案摘要

由于题目保证了单位 0 可以通过唯一的转换路径转换为其他单位,因此我们可以使用深度优先搜索(DFS)来遍历所有单位的转换关系。另外,由于 数组的长度为 $n - 1$,表示有 $n - 1$ 条转换关系,因此我们可以将单位转换关系看作一棵树,根节点为单位 0,其他节点为其他单位。 我们可以用一个邻接表 来表示单位转换关系,其中 表示单位 可以转换到的单位和对应的转换因子。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 图·DFS·traversal 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

n 种单位,编号从 0n - 1。给你一个二维整数数组 conversions,长度为 n - 1,其中 conversions[i] = [sourceUniti, targetUniti, conversionFactori] ,表示一个 sourceUniti 类型的单位等于 conversionFactoritargetUniti 类型的单位。

请你返回一个长度为 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 可以通过 唯一 的转换路径(不需要反向转换)转换为任何其他单位。
lightbulb

解题思路

方法一:DFS

由于题目保证了单位 0 可以通过唯一的转换路径转换为其他单位,因此我们可以使用深度优先搜索(DFS)来遍历所有单位的转换关系。另外,由于 conversions\textit{conversions} 数组的长度为 n1n - 1,表示有 n1n - 1 条转换关系,因此我们可以将单位转换关系看作一棵树,根节点为单位 0,其他节点为其他单位。

我们可以用一个邻接表 gg 来表示单位转换关系,其中 g[i]g[i] 表示单位 ii 可以转换到的单位和对应的转换因子。

然后,我们从根节点 00 开始进行深度优先搜索,即调函数 dfs(s,mul)\textit{dfs}(s, \textit{mul}),其中 ss 表示当前单位,mul\textit{mul} 表示从单位 00 转换到单位 ss 的转换因子。初始时 s=0s = 0, mul=1\textit{mul} = 1。在每次递归中,我们将当前单位 ss 的转换因子 mul\textit{mul} 存储到答案数组中,然后遍历当前单位 ss 的所有邻接单位 tt,递归调用 dfs(t,mul×wmod(109+7))\textit{dfs}(t, \textit{mul} \times w \mod (10^9 + 7)),其中 ww 为单位 ss 转换到单位 tt 的转换因子。

最后,我们返回答案数组即可。

时间复杂度 O(n)O(n),空间复杂度 O(n)O(n)。其中 nn 为单位的数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
    def baseUnitConversions(self, conversions: List[List[int]]) -> List[int]:
        def dfs(s: int, mul: int) -> None:
            ans[s] = mul
            for t, w in g[s]:
                dfs(t, mul * w % mod)

        mod = 10**9 + 7
        n = len(conversions) + 1
        g = [[] for _ in range(n)]
        for s, t, w in conversions:
            g[s].append((t, w))
        ans = [0] * n
        dfs(0, 1)
        return ans
speed

复杂度分析

指标
时间Depends on the final approach
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    The candidate's ability to identify graph traversal as the solution approach will be key.

  • question_mark

    Look for their understanding of Depth-First Search as it applies to this problem's structure.

  • question_mark

    Candidates should demonstrate an understanding of modular arithmetic when handling large numbers in the output.

warning

常见陷阱

外企场景
  • error

    Not correctly using modulo 10^9 + 7, leading to overflow.

  • error

    Misunderstanding the conversion relationships between units and failing to propagate conversion factors through the graph.

  • error

    Not handling recursion depth properly in DFS or running into stack overflow for large inputs.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Adjusting the problem to handle bidirectional conversions between units.

  • arrow_right_alt

    Expanding the problem to handle more complex graph structures with cycles.

  • arrow_right_alt

    Optimizing for space and time complexity when the number of units is very large.

help

常见问题

外企场景

单位转换 I题解:图·DFS·traversal | LeetCode #3528 中等