Solving Leetcode Interviews in Seconds with AI: Minimum Number of Vertices to Reach All Nodes
Introduction
In this blog post, we will explore how to solve the LeetCode problem "1557" 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
Given a directed acyclic graph, with n vertices numbered from 0 to n-1, and an array edges where edges[i] = [fromi, toi] represents a directed edge from node fromi to node toi. Find the smallest set of vertices from which all nodes in the graph are reachable. It's guaranteed that a unique solution exists. Notice that you can return the vertices in any order. Example 1: Input: n = 6, edges = [[0,1],[0,2],[2,5],[3,4],[4,2]] Output: [0,3] Explanation: It's not possible to reach all the nodes from a single vertex. From 0 we can reach [0,1,2,5]. From 3 we can reach [3,4,2,5]. So we output [0,3]. Example 2: Input: n = 5, edges = [[0,1],[2,1],[3,1],[1,4],[2,4]] Output: [0,2,3] Explanation: Notice that vertices 0, 3 and 2 are not reachable from any other node, so we must include them. Also any of these vertices can reach nodes 1 and 4. Constraints: 2 <= n <= 10^5 1 <= edges.length <= min(10^5, n * (n - 1) / 2) edges[i].length == 2 0 <= fromi, toi < n All pairs (fromi, toi) are distinct.
Explanation
Here's the solution to find the smallest set of vertices from which all nodes in a directed acyclic graph are reachable:
High-Level Approach:
- Identify nodes with no incoming edges. These nodes are inherently unreachable from any other node in the graph and must be included in the result.
- Iterate through the edges and mark the 'to' nodes as reachable since they have incoming edges.
- The nodes that were not marked as reachable are the ones with no incoming edges and form the required set.
Complexity:
- Runtime Complexity: O(n + m), where n is the number of vertices and m is the number of edges.
- Storage Complexity: O(n), where n is the number of vertices.
Code
def findSmallestSetOfVertices(n: int, edges: list[list[int]]) -> list[int]:
"""
Finds the smallest set of vertices from which all nodes in a DAG are reachable.
Args:
n: The number of vertices in the graph.
edges: A list of edges, where edges[i] = [fromi, toi].
Returns:
A list of vertices representing the smallest set.
"""
reachable = [False] * n
for edge in edges:
reachable[edge[1]] = True
result = []
for i in range(n):
if not reachable[i]:
result.append(i)
return result