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
相关推荐
luj_176814 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
mCell14 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
KaMeidebaby16 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_176816 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
tmlx3I08117 小时前
高光谱拼接算法(六)RANSAC 误匹配剔除
人工智能·算法·机器学习
不相心 -w-17 小时前
基础-滑动窗口-(定长 | 不定长)
算法
醉城夜风~17 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
ysa05103017 小时前
【板子】ST表
c++·笔记·算法·板子
CHHH_HHH18 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
hurrycry_小亦18 小时前
洛谷题目:P1215 [USACO1.4] 母亲的牛奶 Mother‘s Milk 题解(本题简)
算法