Welcome to Subscribe On Youtube
-
/** In this problem, a tree is an undirected graph that is connected and has no cycles. The given input is a graph that started as a tree with N nodes (with distinct values 1, 2, ..., 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 resulting graph is given as a 2D-array of edges. Each element of edges is a pair [u, v] with u < v, that represents an undirected edge connecting nodes u and v. 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 given 2D-array. The answer edge [u, v] should be in the same format, with u < v. Example 1: Input: [[1,2], [1,3], [2,3]] Output: [2,3] Explanation: The given undirected graph will be like this: 1 / \ 2 - 3 Example 2: Input: [[1,2], [2,3], [3,4], [1,4], [1,5]] Output: [1,4] Explanation: The given undirected graph will be like this: 5 - 1 - 2 | | 4 - 3 Note: The size of the input 2D-array will be between 3 and 1000. Every integer represented in the 2D-array will be between 1 and N, where N is the size of the input array. */ public class Redundant_Connection { } ############ class Solution { private int[] p; public int[] findRedundantConnection(int[][] edges) { p = new int[1010]; for (int i = 0; i < p.length; ++i) { p[i] = i; } for (int[] e : edges) { int a = e[0], b = e[1]; if (find(a) == find(b)) { return e; } p[find(a)] = find(b); } return null; } private int find(int x) { if (p[x] != x) { p[x] = find(p[x]); } return p[x]; } }
-
// OJ: https://leetcode.com/problems/redundant-connection/ // Time: O(N) // Space: O(N) class UnionFind { private: vector<int> id, rank; int cnt; public: UnionFind(int cnt) : cnt(cnt) { id = vector<int>(cnt); rank = vector<int>(cnt, 0); for (int i = 0; i < cnt; ++i) id[i] = i; } int find(int p) { if (id[p] == p) return p; return id[p] = find(id[p]); } int getCount() { return cnt; } bool connected(int p, int q) { return find(p) == find(q); } void connect(int p, int q) { int i = find(p), j = find(q); if (i == j) return; if (rank[i] < rank[j]) id[i] = j; else { id[j] = i; if (rank[i] == rank[j]) rank[j]++; } --cnt; } }; class Solution { public: vector<int> findRedundantConnection(vector<vector<int>>& edges) { UnionFind uf(edges.size()); for (auto e : edges) { if (uf.connected(e[0] - 1, e[1] - 1)) return e; uf.connect(e[0] - 1, e[1] - 1); } } };
-
class Solution: def findRedundantConnection(self, edges: List[List[int]]) -> List[int]: def find(x): if p[x] != x: p[x] = find(p[x]) return p[x] p = list(range(1010)) for a, b in edges: if find(a) == find(b): return [a, b] p[find(a)] = find(b) return [] ############ class Solution: def findRedundantConnection(self, edges): """ :type edges: List[List[int]] :rtype: List[int] """ tree = [-1] * (len(edges) + 1) for edge in edges: a = self.findRoot(edge[0], tree) b = self.findRoot(edge[1], tree) if a != b: tree[a] = b else: return edge def findRoot(self, x, tree): if tree[x] == -1: return x else: root = self.findRoot(tree[x], tree) tree[x] = root return root
-
func findRedundantConnection(edges [][]int) []int { p := make([]int, 1010) for i := range p { p[i] = i } var find func(x int) int find = func(x int) int { if p[x] != x { p[x] = find(p[x]) } return p[x] } for _, e := range edges { a, b := e[0], e[1] if find(a) == find(b) { return e } p[find(a)] = find(b) } return []int{} }
-
/** * @param {number[][]} edges * @return {number[]} */ var findRedundantConnection = function (edges) { let p = Array.from({ length: 1010 }, (_, i) => i); function find(x) { if (p[x] != x) { p[x] = find(p[x]); } return p[x]; } for (let [a, b] of edges) { if (find(a) == find(b)) { return [a, b]; } p[find(a)] = find(b); } return []; };
-
class Solution { public int[] findRedundantConnection(int[][] edges) { int[] redundantConnection = new int[2]; Map<Integer, Integer> nodeGroupMap = new HashMap<Integer, Integer>(); Map<Integer, Set<Integer>> groupNodesMap = new HashMap<Integer, Set<Integer>>(); int nodesCount = edges.length; for (int i = 1; i <= nodesCount; i++) { nodeGroupMap.put(i, i); Set<Integer> set = new HashSet<Integer>(); set.add(i); groupNodesMap.put(i, set); } for (int i = 0; i < nodesCount; i++) { int[] edge = edges[i]; int node1 = edge[0], node2 = edge[1]; int group1 = nodeGroupMap.getOrDefault(node1, node1); int group2 = nodeGroupMap.getOrDefault(node2, node2); if (group1 == group2) { redundantConnection[0] = node1; redundantConnection[1] = node2; break; } else { Set<Integer> set1 = groupNodesMap.getOrDefault(group1, new HashSet<Integer>()); Set<Integer> set2 = groupNodesMap.getOrDefault(group2, new HashSet<Integer>()); if (group1 < group2) { set1.addAll(set2); for (int node : set2) nodeGroupMap.put(node, group1); groupNodesMap.put(group1, set1); } else { set2.addAll(set1); for (int node : set1) nodeGroupMap.put(node, group2); groupNodesMap.put(group2, set2); } } } return redundantConnection; } } ############ class Solution { private int[] p; public int[] findRedundantConnection(int[][] edges) { p = new int[1010]; for (int i = 0; i < p.length; ++i) { p[i] = i; } for (int[] e : edges) { int a = e[0], b = e[1]; if (find(a) == find(b)) { return e; } p[find(a)] = find(b); } return null; } private int find(int x) { if (p[x] != x) { p[x] = find(p[x]); } return p[x]; } }
-
// OJ: https://leetcode.com/problems/redundant-connection/ // Time: O(N) // Space: O(N) class UnionFind { private: vector<int> id, rank; int cnt; public: UnionFind(int cnt) : cnt(cnt) { id = vector<int>(cnt); rank = vector<int>(cnt, 0); for (int i = 0; i < cnt; ++i) id[i] = i; } int find(int p) { if (id[p] == p) return p; return id[p] = find(id[p]); } int getCount() { return cnt; } bool connected(int p, int q) { return find(p) == find(q); } void connect(int p, int q) { int i = find(p), j = find(q); if (i == j) return; if (rank[i] < rank[j]) id[i] = j; else { id[j] = i; if (rank[i] == rank[j]) rank[j]++; } --cnt; } }; class Solution { public: vector<int> findRedundantConnection(vector<vector<int>>& edges) { UnionFind uf(edges.size()); for (auto e : edges) { if (uf.connected(e[0] - 1, e[1] - 1)) return e; uf.connect(e[0] - 1, e[1] - 1); } } };
-
class Solution: def findRedundantConnection(self, edges: List[List[int]]) -> List[int]: def find(x): if p[x] != x: p[x] = find(p[x]) return p[x] p = list(range(1010)) for a, b in edges: if find(a) == find(b): return [a, b] p[find(a)] = find(b) return [] ############ class Solution: def findRedundantConnection(self, edges): """ :type edges: List[List[int]] :rtype: List[int] """ tree = [-1] * (len(edges) + 1) for edge in edges: a = self.findRoot(edge[0], tree) b = self.findRoot(edge[1], tree) if a != b: tree[a] = b else: return edge def findRoot(self, x, tree): if tree[x] == -1: return x else: root = self.findRoot(tree[x], tree) tree[x] = root return root
-
func findRedundantConnection(edges [][]int) []int { p := make([]int, 1010) for i := range p { p[i] = i } var find func(x int) int find = func(x int) int { if p[x] != x { p[x] = find(p[x]) } return p[x] } for _, e := range edges { a, b := e[0], e[1] if find(a) == find(b) { return e } p[find(a)] = find(b) } return []int{} }
-
/** * @param {number[][]} edges * @return {number[]} */ var findRedundantConnection = function (edges) { let p = Array.from({ length: 1010 }, (_, i) => i); function find(x) { if (p[x] != x) { p[x] = find(p[x]); } return p[x]; } for (let [a, b] of edges) { if (find(a) == find(b)) { return [a, b]; } p[find(a)] = find(b); } return []; };