Skip to content

Commit 1fc838e

Browse files
authored
feat: add solutions to lc problem: No.1101 (#2049)
No.1101.The Earliest Moment When Everyone Become Friends
1 parent 56084a8 commit 1fc838e

File tree

4 files changed

+467
-118
lines changed

4 files changed

+467
-118
lines changed

solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/README.md

Lines changed: 194 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -89,36 +89,38 @@ class Solution:
8989

9090
```python
9191
class UnionFind:
92+
__slots__ = ('p', 'size')
93+
9294
def __init__(self, n):
9395
self.p = list(range(n))
9496
self.size = [1] * n
9597

96-
def find(self, x):
98+
def find(self, x: int) -> int:
9799
if self.p[x] != x:
98100
self.p[x] = self.find(self.p[x])
99101
return self.p[x]
100102

101-
def union(self, a, b):
103+
def union(self, a: int, b: int) -> bool:
102104
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
110114

111115

112116
class Solution:
113117
def earliestAcq(self, logs: List[List[int]], n: int) -> int:
114118
uf = UnionFind(n)
115119
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
122124
return -1
123125
```
124126

@@ -179,17 +181,19 @@ class UnionFind {
179181
return p[x];
180182
}
181183

182-
public void union(int a, int b) {
184+
public boolean union(int a, int b) {
183185
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];
192195
}
196+
return true;
193197
}
194198
}
195199

@@ -199,11 +203,7 @@ class Solution {
199203
UnionFind uf = new UnionFind(n);
200204
for (int[] log : logs) {
201205
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) {
207207
return t;
208208
}
209209
}
@@ -249,17 +249,19 @@ public:
249249
iota(p.begin(), p.end(), 0);
250250
}
251251
252-
void unite(int a, int b) {
252+
bool unite(int a, int b) {
253253
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;
262256
}
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;
263265
}
264266
265267
int find(int x) {
@@ -280,11 +282,7 @@ public:
280282
UnionFind uf(n);
281283
for (auto& log : logs) {
282284
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) {
288286
return t;
289287
}
290288
}
@@ -346,37 +344,174 @@ func (uf *unionFind) find(x int) int {
346344
return uf.p[x]
347345
}
348346

349-
func (uf *unionFind) union(a, b int) {
347+
func (uf *unionFind) union(a, b int) bool {
350348
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]
359358
}
359+
return true
360360
}
361361

362362
func earliestAcq(logs [][]int, n int) int {
363363
sort.Slice(logs, func(i, j int) bool { return logs[i][0] < logs[j][0] })
364364
uf := newUnionFind(n)
365365
for _, log := range logs {
366366
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+
}
374372
}
375373
}
376374
return -1
377375
}
378376
```
379377

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+
380515
### **...**
381516

382517
```

0 commit comments

Comments
 (0)