3244. 新增道路查询后的最短距离 II
题目描述
给你一个整数 n
和一个二维整数数组 queries
。
有 n
个城市,编号从 0
到 n - 1
。初始时,每个城市 i
都有一条单向道路通往城市 i + 1
( 0 <= i < n - 1
)。
queries[i] = [ui, vi]
表示新建一条从城市 ui
到城市 vi
的单向道路。每次查询后,你需要找到从城市 0
到城市 n - 1
的最短路径的长度。
所有查询中不会存在两个查询都满足 queries[i][0] < queries[j][0] < queries[i][1] < queries[j][1]
。
返回一个数组 answer
,对于范围 [0, queries.length - 1]
中的每个 i
,answer[i]
是处理完前 i + 1
个查询后,从城市 0
到城市 n - 1
的最短路径的长度。
示例 1:
输入: n = 5, queries = [[2, 4], [0, 2], [0, 4]]
输出: [3, 2, 1]
解释:
新增一条从 2 到 4 的道路后,从 0 到 4 的最短路径长度为 3。
新增一条从 0 到 2 的道路后,从 0 到 4 的最短路径长度为 2。
新增一条从 0 到 4 的道路后,从 0 到 4 的最短路径长度为 1。
示例 2:
输入: n = 4, queries = [[0, 3], [0, 2]]
输出: [1, 1]
解释:
新增一条从 0 到 3 的道路后,从 0 到 3 的最短路径长度为 1。
新增一条从 0 到 2 的道路后,从 0 到 3 的最短路径长度仍为 1。
提示:
3 <= n <= 105
1 <= queries.length <= 105
queries[i].length == 2
0 <= queries[i][0] < queries[i][1] < n
1 < queries[i][1] - queries[i][0]
- 查询中不存在重复的道路。
- 不存在两个查询都满足
i != j
且queries[i][0] < queries[j][0] < queries[i][1] < queries[j][1]
。
解法
方法一:贪心 + 记录跳转位置
我们定义一个长度为 \(n - 1\) 的数组 \(\textit{nxt}\),其中 \(\textit{nxt}[i]\) 表示从城市 \(i\) 可以到达的下一个城市的编号。初始时 \(\textit{nxt}[i] = i + 1\)。
对于每次查询 \([u, v]\),如果此前已经连通了 \(u'\) 和 \(v'\),且 \(u' <= u < v <= v'\),那么我们可以跳过这次查询。否则,我们需要将 \(nxt[u]\) 到 \(nxt[v - 1]\) 这些城市的下一个城市编号设置为 \(0\),并将 \(nxt[u]\) 设置为 \(v\)。
在这个过程中,我们维护一个变量 \(\textit{cnt}\),表示从城市 \(0\) 到城市 \(n - 1\) 的最短路径的长度。初始时 \(\textit{cnt} = n - 1\)。每一次,如果我们将 \([\textit{nxt}[u], \textit{v})\) 这些城市的下一个城市编号设置为 \(0\),那么 \(\textit{cnt}\) 就会减少 \(1\)。
时间复杂度 \(O(n + q)\),空间复杂度 \(O(n)\)。其中 \(n\) 和 \(q\) 分别是城市数量和查询数量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
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 26 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
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 |
|