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
相关推荐
Interview Aid1126 小时前
Google SWE VO 面试真题解析:两轮 Coding 题目与解题思路
面试·职场和发展·google swe·google swe vo
梦帮科技6 小时前
【3.0修订版】音乐权利 NFT:MusicRightsNFT 的确权思想与授权关联
网络协议·算法·web3·区块链·密码学·智能合约·零知识证明
Dfreedom.6 小时前
基于PCA的光谱物质识别分析
算法
强化湿件的技术神甫6 小时前
KS检验和Lilliefors正态性检验方法
算法
yi0117 小时前
DAY23: LeetCode 27 → 283:从移除元素到移动零,理解快慢指针的两种思路
人工智能·笔记·python·算法·leetcode·排序算法·双指针
怕浪猫7 小时前
多 Agent 系统面试怎么答?我总结了 4 种经典架构
人工智能·算法·面试
程序员清风7 小时前
排序算法:从冒泡排序到归并排序
数据结构·算法·排序算法
万年咸鱼7 小时前
C语言内功心法篇——变量与数据类型
c语言·jvm·算法
我命由我123457 小时前
单利计息与复利计息
经验分享·学习·职场和发展·产品运营·求职招聘·职场发展·产品经理
Omics Pro7 小时前
反式感知虚拟细胞!超越线性序列
数据库·人工智能·算法·机器学习·自然语言处理