#3112
Medium
auto_awesome

LeetCode 题解工作台

访问消失节点的最少时间

给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] = [u i , v i , length i ] 表示节点 u i 和节点 v i 之间有一条需要 length i 单位时间通过的无向边。 同时给你一个数组 disappear ,其中 disappear[i] 表…

category

4

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

中等 ·

bolt

答案摘要

我们先创建一个邻接表 ,用于存储图的边。然后创建一个数组 ,用于存储从节点 到其他节点的最短距离。初始化 $\textit{dist}[0] = 0$,其余节点的距离初始化为无穷大。 然后,我们使用 Dijkstra 算法计算从节点 到其他节点的最短距离。具体步骤如下:

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 堆 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] = [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。

同时给你一个数组 disappear ,其中 disappear[i] 表示节点 i 从图中消失的时间点,在那一刻及以后,你无法再访问这个节点。

注意,图有可能一开始是不连通的,两个节点之间也可能有多条边。

请你返回数组 answer ,answer[i] 表示从节点 0 到节点 i 需要的 最少 单位时间。如果从节点 0 出发 无法 到达节点 i ,那么 answer[i] 为 -1 。

 

示例 1:

输入:n = 3, edges = [[0,1,2],[1,2,1],[0,2,4]], disappear = [1,1,5]

输出:[0,-1,4]

解释:

我们从节点 0 出发,目的是用最少的时间在其他节点消失之前到达它们。

  • 对于节点 0 ,我们不需要任何时间,因为它就是我们的起点。
  • 对于节点 1 ,我们需要至少 2 单位时间,通过 edges[0] 到达。但当我们到达的时候,它已经消失了,所以我们无法到达它。
  • 对于节点 2 ,我们需要至少 4 单位时间,通过 edges[2] 到达。

示例 2:

输入:n = 3, edges = [[0,1,2],[1,2,1],[0,2,4]], disappear = [1,3,5]

输出:[0,2,3]

解释:

我们从节点 0 出发,目的是用最少的时间在其他节点消失之前到达它们。

  • 对于节点 0 ,我们不需要任何时间,因为它就是我们的起点。
  • 对于节点 1 ,我们需要至少 2 单位时间,通过 edges[0] 到达。
  • 对于节点 2 ,我们需要至少 3 单位时间,通过 edges[0] 和 edges[1] 到达。

示例 3:

输入:n = 2, edges = [[0,1,1]], disappear = [1,1]

输出:[0,-1]

解释:

当我们到达节点 1 的时候,它恰好消失,所以我们无法到达节点 1 。

 

提示:

  • 1 <= n <= 5 * 104
  • 0 <= edges.length <= 105
  • edges[i] == [ui, vi, lengthi]
  • 0 <= ui, vi <= n - 1
  • 1 <= lengthi <= 105
  • disappear.length == n
  • 1 <= disappear[i] <= 105
lightbulb

解题思路

方法一:堆优化的 Dijkstra

我们先创建一个邻接表 g\textit{g},用于存储图的边。然后创建一个数组 dist\textit{dist},用于存储从节点 00 到其他节点的最短距离。初始化 dist[0]=0\textit{dist}[0] = 0,其余节点的距离初始化为无穷大。

然后,我们使用 Dijkstra 算法计算从节点 00 到其他节点的最短距离。具体步骤如下:

  1. 创建一个优先队列 pq\textit{pq},用于存储节点的距离和节点编号,初始时将节点 00 加入队列,距离为 00
  2. 从队列中取出一个节点 uu,如果 uu 的距离 dudu 大于 dist[u]\textit{dist}[u],说明 uu 已经被更新过了,直接跳过。
  3. 遍历节点 uu 的所有邻居节点 vv,如果 dist[v]>dist[u]+w\textit{dist}[v] > \textit{dist}[u] + wdist[u]+w<disappear[v]\textit{dist}[u] + w < \textit{disappear}[v],则更新 dist[v]=dist[u]+w\textit{dist}[v] = \textit{dist}[u] + w,并将节点 vv 加入队列。
  4. 重复步骤 2 和步骤 3,直到队列为空。

最后,我们遍历 dist\textit{dist} 数组,如果 dist[i]<disappear[i]\textit{dist}[i] < \textit{disappear}[i],则 answer[i]=dist[i]\textit{answer}[i] = \textit{dist}[i],否则 answer[i]=1\textit{answer}[i] = -1

时间复杂度 O(m×logm)O(m \times \log m),空间复杂度 O(m)O(m)。其中 mm 是边的数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
    def minimumTime(
        self, n: int, edges: List[List[int]], disappear: List[int]
    ) -> List[int]:
        g = defaultdict(list)
        for u, v, w in edges:
            g[u].append((v, w))
            g[v].append((u, w))
        dist = [inf] * n
        dist[0] = 0
        pq = [(0, 0)]
        while pq:
            du, u = heappop(pq)
            if du > dist[u]:
                continue
            for v, w in g[u]:
                if dist[v] > dist[u] + w and dist[u] + w < disappear[v]:
                    dist[v] = dist[u] + w
                    heappush(pq, (dist[v], v))
        return [a if a < b else -1 for a, b in zip(dist, disappear)]
speed

复杂度分析

指标
时间complexity depends on the number of nodes and edges processed in the priority queue, generally O((n + edges.length) log n). Space complexity is dominated by the adjacency list, priority queue, and result array, typically O(n + edges.length).
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Check whether the candidate correctly handles nodes that disappear before being reached.

  • question_mark

    Listen for usage of priority queue with Dijkstra to manage earliest arrival times.

  • question_mark

    Watch if the candidate optimizes multiple edges between nodes efficiently.

warning

常见陷阱

外企场景
  • error

    Forgetting to compare current traversal time with node disappear time, causing incorrect reachable nodes.

  • error

    Not handling multiple edges between the same nodes properly, leading to suboptimal paths.

  • error

    Assuming the graph is connected and not accounting for unreachable nodes.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Nodes disappear at random intervals instead of a fixed array, requiring dynamic updates during traversal.

  • arrow_right_alt

    Edges may have time-dependent weights, increasing complexity of minimum arrival computation.

  • arrow_right_alt

    Start node is not fixed at 0, requiring generalized multi-source shortest path handling.

help

常见问题

外企场景

访问消失节点的最少时间题解:堆 | LeetCode #3112 中等