[LeetCode] 323. Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to find the number of connected components in an undirected graph.
Example 1:
0 3
| |
1 --- 2 4
Given n = 5 and edges = [[0, 1], [1, 2], [3, 4]], return 2.
Example 2:
0 4
| |
1 --- 2 --- 3
Given n = 5 and edges = [[0, 1], [1, 2], [2, 3], [3, 4]], return 1.
Note:
You can assume that no duplicate edges will appear in edges. Since all edges are undirected, [0, 1] is the same as [1, 0] and thus will not appear together in edges.
这道题和305. numbers of islands II 是一个思路,一个count初始化为n,union find每次有新的edge就union两个节点,如果两个节点(u, v)原来不在一个连通图里面就减少count并且连起来,如果原来就在一个图里面就不管。用一个索引array来做,union find优化就是加权了,每次把大的树的root当做parent,小的树的root作为child。
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | public class Solution { public int countComponents( int n, int [][] edges) { int count = n; // array to store parent init(n, edges); for ( int [] edge : edges) { int root1 = find(edge[ 0 ]); int root2 = find(edge[ 1 ]); if (root1 != root2) { union(root1, root2); count--; } } return count; } int [] map; private void init( int n, int [][] edges) { map = new int [n]; for ( int [] edge : edges) { map[edge[ 0 ]] = edge[ 0 ]; map[edge[ 1 ]] = edge[ 1 ]; } } private int find( int child) { while (map[child] != child) child = map[child]; return child; } private void union( int child, int parent) { map[child] = parent; } } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # Time: O(nlog*n) ~= O(n), n is the length of the positions # Space: O(n) class UnionFind( object ): def __init__( self , n): self . set = range (n) self .count = n def find_set( self , x): if self . set [x] ! = x: self . set [x] = self .find_set( self . set [x]) # path compression. return self . set [x] def union_set( self , x, y): x_root, y_root = map ( self .find_set, (x, y)) if x_root ! = y_root: self . set [ min (x_root, y_root)] = max (x_root, y_root) self .count - = 1 class Solution( object ): def countComponents( self , n, edges): """ :type n: int :type edges: List[List[int]] :rtype: int """ union_find = UnionFind(n) for i, j in edges: union_find.union_set(i, j) return union_find.count |
类似题目:
[LeetCode] 547. Friend Circles 朋友圈
[LeetCode] 200. Number of Islands 岛屿的数量
[LeetCode] 305. Number of Islands II 岛屿的数量 II
Find minimum number of people to reach to spread a message across all people in twitter
All LeetCode Questions List 题目汇总
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架