Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 1fc838e

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /