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.

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.

There are no two queries such that queries[i][0] < queries[j][0] < queries[i][1] < queries[j][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.

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
相关推荐
siy23332 小时前
[c语言日寄]精英怪:三子棋(tic-tac-toe)3命慢通[附免费源码]
c语言·开发语言·笔记·学习·算法
arnold662 小时前
华为OD E卷(100分)53-TLV解码
java·算法·华为od
_周游3 小时前
【C语言】_sizeof与strlen的相关示例
c语言·开发语言·算法
测试杂货铺3 小时前
Pytest入门—allure生成报告
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
Lunar*4 小时前
使用分割 Mask 和 K-means 聚类获取天空的颜色
算法·kmeans·聚类
程序员三藏4 小时前
selenium操作指南,2万字总结
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
冠位观测者5 小时前
【Leetcode 热题 100】215. 数组中的第K个最大元素
数据结构·算法·leetcode
忆源5 小时前
C -- 结构体内存对齐的原理
c语言·开发语言·算法
朔北之忘 Clancy5 小时前
2024 年 3 月青少年软编等考 C 语言二级真题解析
c语言·开发语言·c++·学习·算法·青少年编程·题解
躺不平的理查德5 小时前
C 语言中二维数组的退化
c语言·开发语言·数据结构·算法