题目链接
分析
简单的做法就是直接进行 BFS 求解,可以使用 DP 进行优化
定义 $dp[i]$ 为从 $0$ 到 $i$ 的最短路
用 $pre[i]$ 记录终点为 $i$ 的额外添加的边的起点表
那么,对于每个点,可以从 $i - 1$ 到 $i$ ,或是从 $pre[i]$ 中的任意一点到 $i$
于是我们用这些点作为转移来源,更新 $dp[i]$ 的最小值
答案即为 $dp[n - 1]$
代码实现
class Solution {
public:
vector<int> shortestDistanceAfterQueries(int n, vector<vector<int>>& queries) {
int m = queries.size();
vector<int> ans, dp(n);
vector<vector<int>> pre(n);
for(int i = 1; i < n; ++i)
dp[i] = i, pre[i].emplace_back(i - 1);
for(auto &query : queries)
{
pre[query[1]].emplace_back(query[0]);
for(int v = query[1]; v < n; ++v)
for(int u : pre[v])
dp[v] = min(dp[v], dp[u] + 1);
ans.emplace_back(*dp.rbegin());
}
return ans;
}
};
复杂度分析
- 时间复杂度:$O(q * (n + q))$ ,$q$ 为 $query$ 的长度
- 空间复杂度:$O(n+q)$