leetcode - 3243. Shortest Distance After Road Addition Queries I

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.

queries[i] = [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.

Return an array answer where for each i in the range [0, queries.length - 1], answer[i] 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.

Constraints:

3 <= n <= 500
1 <= queries.length <= 500
queries[i].length == 2
0 <= queries[i][0] < queries[i][1] < n
1 < queries[i][1] - queries[i][0]
There are no repeated roads among the queries.

Solution

Intuitive

Use a list to store the original path, and a hash map to store the node’s neighbors. When there’s a new path/query, change the node distance and all the distances after that node.

Time complexity: o ( n ∗ n ) o(n*n) o(nn)
Space complexity: o ( n ) o(n) o(n)

Code

Intuitive

class Solution:
    def shortestDistanceAfterQueries(self, n: int, queries: List[List[int]]) -> List[int]:
        distance = list(range(n))
        neighbor = {i + 1: [i] for i in range(n)}
        res = []
        for each_query in queries:
            each_query.sort()
            start_city, end_city = each_query
            neighbor[end_city].append(start_city)
            distance[end_city] = min(distance[neighbor_city] + 1 for neighbor_city in neighbor[end_city])
            # update all the cities at the right
            prev_city = end_city
            for right_city in range(end_city + 1, n):
                distance[right_city] = min(distance[neighbor_city] + 1 for neighbor_city in neighbor[right_city])
                prev_city += 1
            res.append(distance[-1])
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值