Solving Leetcode Interviews in Seconds with AI: Shortest Distance After Road Addition Queries II
Introduction
In this blog post, we will explore how to solve the LeetCode problem "3244" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.
Problem Statement
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. Constraints: 3 <= n <= 105 1 <= queries.length <= 105 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. There are no two queries such that i != j and queries[i][0] < queries[j][0] < queries[i][1] < queries[j][1].
Explanation
Here's a breakdown of the solution:
- Leverage BFS: Use Breadth-First Search (BFS) to find the shortest path from city 0 to city n-1 after each query. BFS is well-suited for finding shortest paths in unweighted graphs.
- Dynamic Graph Construction: Rebuild the graph from scratch after each query by including the original edges (i to i+1) and the new roads added from the queries.
Iterative Query Processing: Process each query one by one, updating the graph and then running BFS.
Runtime Complexity: O(Q * N), where Q is the number of queries and N is the number of cities.
- Storage Complexity: O(N), primarily due to the adjacency list representation of the graph.
Code
from collections import deque
def shortest_paths_after_queries(n: int, queries: list[list[int]]) -> list[int]:
"""
Calculates the shortest path from city 0 to city n-1 after each query.
Args:
n: The number of cities.
queries: A list of queries, where each query is a list [ui, vi] representing
a new unidirectional road from city ui to city vi.
Returns:
A list of shortest path lengths after each query.
"""
results = []
for i in range(len(queries)):
# Build the graph
adj = [[] for _ in range(n)]
# Add default roads
for j in range(n - 1):
adj[j].append(j + 1)
# Add roads from queries
for k in range(i + 1):
u, v = queries[k]
adj[u].append(v)
# BFS to find shortest path
queue = deque([(0, 0)]) # (node, distance)
visited = {0}
shortest_path = -1
while queue:
node, distance = queue.popleft()
if node == n - 1:
shortest_path = distance
break
for neighbor in adj[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append((neighbor, distance + 1))
results.append(shortest_path)
return results