Redundant Connection
In this problem, a tree is an undirected graph that is connected and has no cycles.
You are given a graph that started as a tree with n
nodes labeled from 1
to n
, with one additional edge added. The added edge has two different vertices chosen from 1
to n
, and was not an edge that already existed. The graph is represented as an array edges
of length n
where edges[i] = [ai, bi]
indicates that there is an edge between nodes ai
and bi
in the graph.
Return an edge that can be removed so that the resulting graph is a tree of n
nodes. If there are multiple answers, return the answer that occurs last in the input.
Example 1:
Input: edges = [[1,2],[1,3],[2,3]]
Output: [2,3]
Example 2:
Input: edges = [[1,2],[2,3],[3,4],[1,4],[1,5]]
Output: [1,4]
Constraints:
n == edges.length
3 <= n <= 1000
edges[i].length == 2
1 <= ai < bi <= edges.length
ai != bi
- There are no repeated edges.
- The given graph is connected.
Solution
We will apply Kruskal's algorithm using Union Find on this special graph where all the edges have equal weight (no sorting needed!).
Instead of discarding an edge when we find a cycle, we return this edge as the answer.
Moreover, the weight of the path is irrelevent to the problem, so we will not keep track.
We follow the same implementation as finding the minimum spanning tree using Kruskal's algorithm.
When we find an edge e
such that its two ends are in the same component, we know that it will create a cycle, hence e
is the extra edge added into the tree.
Implementation
1def findRedundantConnection(edges: List[List[int]]) -> List[int]:
2 id = {}
3 def find(x):
4 y = id.get(x, x)
5 if y != x:
6 id[x] = y = find(y)
7 return y
8 def union(x, y):
9 id[find(x)] = find(y)
10
11 for e in edges:
12 if find(e[0]) == find(e[1]): # two ends in the same component
13 return e
14 union(e[0], e[1]) # join two components
What is the running time of the following code?
1int sqrt(int n) { 2 for (int guess = 1; guess * guess <= n; guess++) { 3 if (guess * guess == n) { 4 return guess; 5 } 6 } 7 return -1; 8}
Depth first search can be used to find whether two components in a graph are connected.
How does merge sort divide the problem into subproblems?
A person thinks of a number between 1 and 1000. You may ask any number questions to them, provided that the question can be answered with either "yes" or "no".
What is the minimum number of questions you needed to ask so that you are guaranteed to know the number that the person is thinking?
Recommended Readings
Top Patterns to Conquer the Technical Coding Interview Should the written word bore you fear not A delightful video alternative awaits iframe width 560 height 315 src https www youtube com embed LW8Io6IPYHw title YouTube video player frameborder 0 allow accelerometer autoplay clipboard write encrypted media gyroscope picture in picture
Recursion Recursion is one of the most important concepts in computer science Simply speaking recursion is the process of a function calling itself Using a real life analogy imagine a scenario where you invite your friends to lunch https algomonster s3 us east 2 amazonaws com recursion jpg You first
Runtime Overview When learning about algorithms and data structures you'll frequently encounter the term time complexity This concept is fundamental in computer science and offers insights into how long an algorithm takes to complete given a certain input size What is Time Complexity Time complexity represents the amount of time
Got a question? Ask the Teaching Assistant anything you don't understand.
Still not clear? Ask in the Forum, Discord or Submit the part you don't understand to our editors.