Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Shortest Distance After Road Addition Queries II

Updated
3 min read

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

More from this blog

C

Chatmagic blog

2894 posts