File tree Expand file tree Collapse file tree 1 file changed +71
-0
lines changed
number-of-connected-components-in-an-undirected-graph Expand file tree Collapse file tree 1 file changed +71
-0
lines changed Original file line number Diff line number Diff line change 1+ /**
2+ * https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph
3+ * T.C. O(V + E)
4+ * S.C. O(V + E)
5+ */
6+ function countComponents ( n : number , edges : number [ ] [ ] ) : number {
7+ const graph = new Map < number , number [ ] > ( ) ;
8+
9+ for ( let i = 0 ; i < n ; i ++ ) {
10+ graph . set ( i , [ ] ) ;
11+ }
12+
13+ for ( const [ u , v ] of edges ) {
14+ graph . get ( u ) ! . push ( v ) ;
15+ graph . get ( v ) ! . push ( u ) ;
16+ }
17+
18+ function dfs ( node : number ) {
19+ visited . add ( node ) ;
20+
21+ for ( const neighbor of graph . get ( node ) ! ) {
22+ if ( ! visited . has ( neighbor ) ) {
23+ dfs ( neighbor ) ;
24+ }
25+ }
26+ }
27+
28+ const visited = new Set < number > ( ) ;
29+
30+ let components = 0 ;
31+
32+ for ( let i = 0 ; i < n ; i ++ ) {
33+ if ( ! visited . has ( i ) ) {
34+ components ++ ;
35+ dfs ( i ) ;
36+ }
37+ }
38+
39+ return components ;
40+ }
41+
42+ /**
43+ * Using Union Find
44+ * T.C. O(V + E)
45+ *
46+ */
47+ function countComponents ( n : number , edges : number [ ] [ ] ) : number {
48+ const parent = Array . from ( { length : n } , ( _ , i ) => i ) ;
49+
50+ // find and compress path
51+ function find ( x : number ) : number {
52+ if ( parent [ x ] !== x ) {
53+ parent [ x ] = find ( parent [ x ] ) ;
54+ }
55+ return parent [ x ] ;
56+ }
57+
58+ // union two sets and check if they have the same root
59+ function union ( x : number , y : number ) : boolean {
60+ const rootX = find ( x ) ;
61+ const rootY = find ( y ) ;
62+ parent [ rootX ] = rootY ;
63+ return true ;
64+ }
65+
66+ for ( const [ x , y ] of edges ) {
67+ union ( x , y ) ;
68+ }
69+
70+ return new Set ( parent . map ( find ) ) . size ;
71+ }
You can’t perform that action at this time.
0 commit comments