题目描述:
给你一个整数 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
的最短路径的长度。
代码思路:
-
初始化位置 :首先,我们有一个长度为
n
的数组d
,表示初始位置,其中每个位置i
存放的是i
。 -
处理每个查询:
- 对于每个查询
queries[i]
,我们需要找到初始位置queries[i][0]
和目标位置queries[i][1]
在当前数组d
中的位置。 - 将初始位置到目标位置之间的所有元素(包括初始位置但不包括目标位置,如果它们不相同)从数组
d
中移除,模拟点的移动和位置的重新编号。 - 计算新的位置
0
到被移动点的最短距离。由于移动后位置重新编号,被移动的点将位于新的数组d
的中间位置(或者偏左或偏右,取决于移动的方向和距离),因此最短距离将是数组d
长度的一半(取整),除非被移动的点正好在位置0
(此时距离为0
)。
- 对于每个查询
-
返回结果 :将所有查询后的最短距离存储在数组
ans
中,并返回该数组。cppclass Solution { public: vector<int> shortestDistanceAfterQueries(int n, vector<vector<int>>& queries) { vector<int> d(n), ans(queries.size()); iota(d.begin(), d.end(), 0); for (int i = 0; i < queries.size(); i++) { auto l = upper_bound(d.begin(), d.end(), queries[i][0]); auto r = lower_bound(d.begin(), d.end(), queries[i][1]); if (l <= r) d.erase(l, r); ans[i] = d.size() - 1; } return ans; } };