@@ -89,36 +89,38 @@ class Solution:
89
89
90
90
``` python
91
91
class UnionFind :
92
+ __slots__ = (' p' , ' size' )
93
+
92
94
def __init__ (self , n ):
93
95
self .p = list (range (n))
94
96
self .size = [1 ] * n
95
97
96
- def find (self , x ) :
98
+ def find (self , x : int ) -> int :
97
99
if self .p[x] != x:
98
100
self .p[x] = self .find(self .p[x])
99
101
return self .p[x]
100
102
101
- def union (self , a , b ) :
103
+ def union (self , a : int , b : int ) -> bool :
102
104
pa, pb = self .find(a), self .find(b)
103
- if pa != pb:
104
- if self .size[pa] > self .size[pb]:
105
- self .p[pb] = pa
106
- self .size[pa] += self .size[pb]
107
- else :
108
- self .p[pa] = pb
109
- self .size[pb] += self .size[pa]
105
+ if pa == pb:
106
+ return False
107
+ if self .size[pa] > self .size[pb]:
108
+ self .p[pb] = pa
109
+ self .size[pa] += self .size[pb]
110
+ else :
111
+ self .p[pa] = pb
112
+ self .size[pb] += self .size[pa]
113
+ return True
110
114
111
115
112
116
class Solution :
113
117
def earliestAcq (self , logs : List[List[int ]], n : int ) -> int :
114
118
uf = UnionFind(n)
115
119
for t, x, y in sorted (logs):
116
- if uf.find(x) == uf.find(y):
117
- continue
118
- uf.union(x, y)
119
- n -= 1
120
- if n == 1 :
121
- return t
120
+ if uf.union(x, y):
121
+ n -= 1
122
+ if n == 1 :
123
+ return t
122
124
return - 1
123
125
```
124
126
@@ -179,17 +181,19 @@ class UnionFind {
179
181
return p[x];
180
182
}
181
183
182
- public void union (int a , int b ) {
184
+ public boolean union (int a , int b ) {
183
185
int pa = find(a), pb = find(b);
184
- if (pa != pb) {
185
- if (size[pa] > size[pb]) {
186
- p[pb] = pa;
187
- size[pa] += size[pb];
188
- } else {
189
- p[pa] = pb;
190
- size[pb] += size[pa];
191
- }
186
+ if (pa == pb) {
187
+ return false ;
188
+ }
189
+ if (size[pa] > size[pb]) {
190
+ p[pb] = pa;
191
+ size[pa] += size[pb];
192
+ } else {
193
+ p[pa] = pb;
194
+ size[pb] += size[pa];
192
195
}
196
+ return true ;
193
197
}
194
198
}
195
199
@@ -199,11 +203,7 @@ class Solution {
199
203
UnionFind uf = new UnionFind (n);
200
204
for (int [] log : logs) {
201
205
int t = log[0 ], x = log[1 ], y = log[2 ];
202
- if (uf. find(x) == uf. find(y)) {
203
- continue ;
204
- }
205
- uf. union(x, y);
206
- if (-- n == 1 ) {
206
+ if (uf. union(x, y) && -- n == 1 ) {
207
207
return t;
208
208
}
209
209
}
@@ -249,17 +249,19 @@ public:
249
249
iota(p.begin(), p.end(), 0);
250
250
}
251
251
252
- void unite(int a, int b) {
252
+ bool unite(int a, int b) {
253
253
int pa = find(a), pb = find(b);
254
- if (pa != pb) {
255
- if (size[pa] > size[pb]) {
256
- p[pb] = pa;
257
- size[pa] += size[pb];
258
- } else {
259
- p[pa] = pb;
260
- size[pb] += size[pa];
261
- }
254
+ if (pa == pb) {
255
+ return false;
262
256
}
257
+ if (size[pa] > size[pb]) {
258
+ p[pb] = pa;
259
+ size[pa] += size[pb];
260
+ } else {
261
+ p[pa] = pb;
262
+ size[pb] += size[pa];
263
+ }
264
+ return true;
263
265
}
264
266
265
267
int find(int x) {
@@ -280,11 +282,7 @@ public:
280
282
UnionFind uf(n);
281
283
for (auto& log : logs) {
282
284
int t = log[0], x = log[1], y = log[2];
283
- if (uf.find(x) == uf.find(y)) {
284
- continue;
285
- }
286
- uf.unite(x, y);
287
- if (--n == 1) {
285
+ if (uf.unite(x, y) && --n == 1) {
288
286
return t;
289
287
}
290
288
}
@@ -346,37 +344,174 @@ func (uf *unionFind) find(x int) int {
346
344
return uf.p [x]
347
345
}
348
346
349
- func (uf *unionFind ) union (a , b int ) {
347
+ func (uf *unionFind ) union (a , b int ) bool {
350
348
pa , pb := uf.find (a), uf.find (b)
351
- if pa != pb {
352
- if uf.size [pa] > uf.size [pb] {
353
- uf.p [pb] = pa
354
- uf.size [pa] += uf.size [pb]
355
- } else {
356
- uf.p [pa] = pb
357
- uf.size [pb] += uf.size [pa]
358
- }
349
+ if pa == pb {
350
+ return false
351
+ }
352
+ if uf.size [pa] > uf.size [pb] {
353
+ uf.p [pb] = pa
354
+ uf.size [pa] += uf.size [pb]
355
+ } else {
356
+ uf.p [pa] = pb
357
+ uf.size [pb] += uf.size [pa]
359
358
}
359
+ return true
360
360
}
361
361
362
362
func earliestAcq (logs [][]int , n int ) int {
363
363
sort.Slice (logs, func (i, j int ) bool { return logs[i][0 ] < logs[j][0 ] })
364
364
uf := newUnionFind (n)
365
365
for _ , log := range logs {
366
366
t , x , y := log[0 ], log[1 ], log[2 ]
367
- if uf.find (x) == uf.find (y) {
368
- continue
369
- }
370
- uf.union (x, y)
371
- n--
372
- if n == 1 {
373
- return t
367
+ if uf.union (x, y) {
368
+ n--
369
+ if n == 1 {
370
+ return t
371
+ }
374
372
}
375
373
}
376
374
return -1
377
375
}
378
376
```
379
377
378
+ ### ** TypeScript**
379
+
380
+ ``` ts
381
+ function earliestAcq(logs : number [][], n : number ): number {
382
+ const p: number [] = Array (n )
383
+ .fill (0 )
384
+ .map ((_ , i ) => i );
385
+ const find = (x : number ): number => {
386
+ if (p [x ] !== x ) {
387
+ p [x ] = find (p [x ]);
388
+ }
389
+ return p [x ];
390
+ };
391
+ logs .sort ((a , b ) => a [0 ] - b [0 ]);
392
+ for (const [t, x, y] of logs ) {
393
+ const rx = find (x );
394
+ const ry = find (y );
395
+ if (rx !== ry ) {
396
+ p [rx ] = ry ;
397
+ if (-- n === 1 ) {
398
+ return t ;
399
+ }
400
+ }
401
+ }
402
+ return - 1 ;
403
+ }
404
+ ```
405
+
406
+ ``` ts
407
+ class UnionFind {
408
+ private p: number [];
409
+ private size: number [];
410
+
411
+ constructor (n : number ) {
412
+ this .p = Array (n )
413
+ .fill (0 )
414
+ .map ((_ , i ) => i );
415
+ this .size = Array (n ).fill (1 );
416
+ }
417
+
418
+ find(x : number ): number {
419
+ if (this .p [x ] !== x ) {
420
+ this .p [x ] = this .find (this .p [x ]);
421
+ }
422
+ return this .p [x ];
423
+ }
424
+
425
+ union(a : number , b : number ): boolean {
426
+ const pa = this .find (a );
427
+ const pb = this .find (b );
428
+ if (pa === pb ) {
429
+ return false ;
430
+ }
431
+ if (this .size [pa ] > this .size [pb ]) {
432
+ this .p [pb ] = pa ;
433
+ this .size [pa ] += this .size [pb ];
434
+ } else {
435
+ this .p [pa ] = pb ;
436
+ this .size [pb ] += this .size [pa ];
437
+ }
438
+ return true ;
439
+ }
440
+ }
441
+
442
+ function earliestAcq(logs : number [][], n : number ): number {
443
+ logs .sort ((a , b ) => a [0 ] - b [0 ]);
444
+ const uf = new UnionFind (n );
445
+ for (const [t, x, y] of logs ) {
446
+ if (uf .union (x , y ) && -- n === 1 ) {
447
+ return t ;
448
+ }
449
+ }
450
+ return - 1 ;
451
+ }
452
+ ```
453
+
454
+ ### ** Rust**
455
+
456
+ ``` rust
457
+ struct UnionFind {
458
+ p : Vec <usize >,
459
+ size : Vec <usize >,
460
+ }
461
+
462
+ impl UnionFind {
463
+ fn new (n : usize ) -> Self {
464
+ let p : Vec <usize > = (0 .. n ). collect ();
465
+ let size = vec! [1 ; n ];
466
+ UnionFind { p , size }
467
+ }
468
+
469
+ fn find (& mut self , x : usize ) -> usize {
470
+ if self . p[x ] != x {
471
+ self . p[x ] = self . find (self . p[x ]);
472
+ }
473
+ self . p[x ]
474
+ }
475
+
476
+ fn union (& mut self , a : usize , b : usize ) -> bool {
477
+ let pa = self . find (a );
478
+ let pb = self . find (b );
479
+ if pa == pb {
480
+ false
481
+ } else if self . size[pa ] > self . size[pb ] {
482
+ self . p[pb ] = pa ;
483
+ self . size[pa ] += self . size[pb ];
484
+ true
485
+ } else {
486
+ self . p[pa ] = pb ;
487
+ self . size[pb ] += self . size[pa ];
488
+ true
489
+ }
490
+ }
491
+ }
492
+
493
+ impl Solution {
494
+ pub fn earliest_acq (logs : Vec <Vec <i32 >>, n : i32 ) -> i32 {
495
+ let mut logs = logs ;
496
+ logs . sort_by (| a , b | a [0 ]. cmp (& b [0 ]));
497
+ let mut uf = UnionFind :: new (n as usize );
498
+ let mut n = n ;
499
+ for log in logs {
500
+ let t = log [0 ];
501
+ let x = log [1 ] as usize ;
502
+ let y = log [2 ] as usize ;
503
+ if uf . union (x , y ) {
504
+ n -= 1 ;
505
+ if n == 1 {
506
+ return t ;
507
+ }
508
+ }
509
+ }
510
+ - 1
511
+ }
512
+ }
513
+ ```
514
+
380
515
### ** ...**
381
516
382
517
```
0 commit comments