LeetCode 0684. Redundant Connection Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
0684. Redundant Connection

Description

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.

Solutions

Solution 1: Union-Find

According to the problem description, we need to find an edge that can be removed so that the remaining part is a tree with n nodes. We can traverse each edge and determine whether the two nodes of this edge are in the same connected component. If they are in the same connected component, it means this edge is redundant and can be removed, so we directly return this edge. Otherwise, we merge the two nodes connected by this edge into the same connected component.

The time complexity is O(n log n), and the space complexity is O(n). Here, n is the number of edges.

PythonJavaC++GoTypeScriptJavaScript
class Solution: def findRedundantConnection(self, edges: List[List[int]]) -> List[int]: def find(x: int) -> int: if p[x] != x: p[x] = find(p[x]) return p[x] p = list(range(len(edges))) for a, b in edges: pa, pb = find(a - 1), find(b - 1) if pa == pb: return [a, b] p[pa] = pb(code-box)

Solution 2: Union-Find (Template Approach)

Here is a template approach using Union-Find for your reference.

The time complexity is O(n α(n)), and the space complexity is O(n). Here, n is the number of edges, and α(n) is the inverse Ackermann function, which can be considered a very small constant.

PythonJavaC++GoTypeScriptJavaScript
class UnionFind: __slots__ = "p", "size" def __init__(self, n: int): self.p: List[int] = list(range(n)) self.size: List[int] = [1] * n def find(self, x: int) -> int: if self.p[x] != x: self.p[x] = self.find(self.p[x]) return self.p[x] def union(self, a: int, b: int) -> bool: pa, pb = self.find(a), self.find(b) if pa == pb: return False if self.size[pa] > self.size[pb]: self.p[pb] = pa self.size[pa] += self.size[pb] else: self.p[pa] = pb self.size[pb] += self.size[pa] return True class Solution: def findRedundantConnection(self, edges: List[List[int]]) -> List[int]: uf = UnionFind(len(edges)) for a, b in edges: if not uf.union(a - 1, b - 1): return [a, b](code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !