leetcode - 3244. Shortest Distance After Road Addition Queries II

Description

You are given an integer n and a 2D integer array queries.

There are n cities numbered from 0 to n - 1. Initially, there is a unidirectional road from city i to city i + 1 for all 0 <= i < n - 1.

queriesi = ui, vi represents the addition of a new unidirectional road from city ui to city vi. After each query, you need to find the length of the shortest path from city 0 to city n - 1.

There are no two queries such that queriesi0 < queriesj0 < queriesi1 < queriesj1.

Return an array answer where for each i in the range 0, queries.length - 1, answeri is the length of the shortest path from city 0 to city n - 1 after processing the first i + 1 queries.

Example 1:

复制代码
Input: n = 5, queries = [[2,4],[0,2],[0,4]]

Output: [3,2,1]

Explanation:
复制代码
After the addition of the road from 2 to 4, the length of the shortest path from 0 to 4 is 3.
复制代码
After the addition of the road from 0 to 2, the length of the shortest path from 0 to 4 is 2.
复制代码
After the addition of the road from 0 to 4, the length of the shortest path from 0 to 4 is 1.

Example 2:

复制代码
Input: n = 4, queries = [[0,3],[0,2]]

Output: [1,1]

Explanation:
复制代码
After the addition of the road from 0 to 3, the length of the shortest path from 0 to 3 is 1.
复制代码
After the addition of the road from 0 to 2, the length of the shortest path remains 1.

Solution

Similar to 3243. Shortest Distance After Road Addition Queries I, but this time with more data and an additional rule: no overlapped queries.

So we have a tricky way to solve this, because we don't have overlapped queries, so we could just drop the nodes between each query. And the length of the graph would be our answer.

Here we use a hash map to denote the graph.

Time complexity: o ( n + q ) o(n+q) o(n+q)

Space complexity: o ( n ) o(n) o(n)

Code

python3 复制代码
class Solution:
    def shortestDistanceAfterQueries(self, n: int, queries: List[List[int]]) -> List[int]:
        neighbors = {i: i + 1 for i in range(n - 1)}
        res = []
        for each_query in queries:
            start_city, end_city = each_query
            # if start_city is in the graph and the new query gives us a shorter way
            if start_city in neighbors and neighbors[start_city] < end_city:
                cur_city = neighbors[start_city]
                while cur_city < end_city:
                    cur_city = neighbors.pop(cur_city)
                neighbors[start_city] = end_city
            res.append(len(neighbors))
        return res
相关推荐
lengxuenong几秒前
树状数组 · 信息学学习手册1-求和3个模板
c++·学习·算法·青少年编程
zhangminghuan6 分钟前
前端面试应对技巧
前端·面试·职场和发展
ComputerInBook10 分钟前
泛函分析概观
人工智能·算法·机器学习·泛函分析
Nuanyt36 分钟前
LeetCode Hot100 刷题笔记 · 普通数组专题
java·笔记·算法·leetcode
q275513004237 分钟前
AS8132 DP转HDMI 4K60(420)被动式 国产性价比AS方案
linux·算法·硬件架构·dash
安全指北针42 分钟前
密态计算:数据 “可用不可见” 的底层技术解析
人工智能·算法
Jmyd01231 小时前
3D 扫描仪选型技术拆解:精度、点云与软件链路
人工智能·算法·3d·三维数字化
xxxiugou1231 小时前
链表算法题精讲:从两数相加到K组翻转
数据结构·c++·算法·链表
梦帮科技1 小时前
量子纠缠网络与量子隐形传态攻防:量子中继器信道串扰、纠缠态保真度降解与量子路由劫持
开发语言·网络·人工智能·算法·自动化·php
老王IT2 小时前
C语言语法基础语法介绍
c语言·开发语言·算法