From 53f405c5e942a691e5b1a01c5b0b5cee5edcbca5 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Sat, 2 Dec 2023 09:49:23 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.1101 No.1101.The Earliest Moment When Everyone Become Friends --- .../README.md | 253 ++++++++++++++---- .../README_EN.md | 253 ++++++++++++++---- .../Solution.rs | 56 ++++ .../Solution.ts | 23 ++ 4 files changed, 467 insertions(+), 118 deletions(-) create mode 100644 solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/Solution.rs create mode 100644 solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/Solution.ts diff --git a/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/README.md b/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/README.md index 327d88a4c2411..6c55167068918 100644 --- a/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/README.md +++ b/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/README.md @@ -89,36 +89,38 @@ class Solution: ```python class UnionFind: + __slots__ = ('p', 'size') + def __init__(self, n): self.p = list(range(n)) self.size = [1] * n - def find(self, x): + def find(self, x: int) -> int: if self.p[x] != x: self.p[x] = self.find(self.p[x]) return self.p[x] - def union(self, a, b): + def union(self, a: int, b: int) -> bool: pa, pb = self.find(a), self.find(b) - if pa != pb: - if self.size[pa] > self.size[pb]: - self.p[pb] = pa - self.size[pa] += self.size[pb] - else: - self.p[pa] = pb - self.size[pb] += self.size[pa] + if pa == pb: + return False + if self.size[pa] > self.size[pb]: + self.p[pb] = pa + self.size[pa] += self.size[pb] + else: + self.p[pa] = pb + self.size[pb] += self.size[pa] + return True class Solution: def earliestAcq(self, logs: List[List[int]], n: int) -> int: uf = UnionFind(n) for t, x, y in sorted(logs): - if uf.find(x) == uf.find(y): - continue - uf.union(x, y) - n -= 1 - if n == 1: - return t + if uf.union(x, y): + n -= 1 + if n == 1: + return t return -1 ``` @@ -179,17 +181,19 @@ class UnionFind { return p[x]; } - public void union(int a, int b) { + public boolean union(int a, int b) { int pa = find(a), pb = find(b); - if (pa != pb) { - if (size[pa] > size[pb]) { - p[pb] = pa; - size[pa] += size[pb]; - } else { - p[pa] = pb; - size[pb] += size[pa]; - } + if (pa == pb) { + return false; + } + if (size[pa] > size[pb]) { + p[pb] = pa; + size[pa] += size[pb]; + } else { + p[pa] = pb; + size[pb] += size[pa]; } + return true; } } @@ -199,11 +203,7 @@ class Solution { UnionFind uf = new UnionFind(n); for (int[] log : logs) { int t = log[0], x = log[1], y = log[2]; - if (uf.find(x) == uf.find(y)) { - continue; - } - uf.union(x, y); - if (--n == 1) { + if (uf.union(x, y) && --n == 1) { return t; } } @@ -249,17 +249,19 @@ public: iota(p.begin(), p.end(), 0); } - void unite(int a, int b) { + bool unite(int a, int b) { int pa = find(a), pb = find(b); - if (pa != pb) { - if (size[pa] > size[pb]) { - p[pb] = pa; - size[pa] += size[pb]; - } else { - p[pa] = pb; - size[pb] += size[pa]; - } + if (pa == pb) { + return false; } + if (size[pa] > size[pb]) { + p[pb] = pa; + size[pa] += size[pb]; + } else { + p[pa] = pb; + size[pb] += size[pa]; + } + return true; } int find(int x) { @@ -280,11 +282,7 @@ public: UnionFind uf(n); for (auto& log : logs) { int t = log[0], x = log[1], y = log[2]; - if (uf.find(x) == uf.find(y)) { - continue; - } - uf.unite(x, y); - if (--n == 1) { + if (uf.unite(x, y) && --n == 1) { return t; } } @@ -346,17 +344,19 @@ func (uf *unionFind) find(x int) int { return uf.p[x] } -func (uf *unionFind) union(a, b int) { +func (uf *unionFind) union(a, b int) bool { pa, pb := uf.find(a), uf.find(b) - if pa != pb { - if uf.size[pa] > uf.size[pb] { - uf.p[pb] = pa - uf.size[pa] += uf.size[pb] - } else { - uf.p[pa] = pb - uf.size[pb] += uf.size[pa] - } + if pa == pb { + return false + } + if uf.size[pa] > uf.size[pb] { + uf.p[pb] = pa + uf.size[pa] += uf.size[pb] + } else { + uf.p[pa] = pb + uf.size[pb] += uf.size[pa] } + return true } func earliestAcq(logs [][]int, n int) int { @@ -364,19 +364,154 @@ func earliestAcq(logs [][]int, n int) int { uf := newUnionFind(n) for _, log := range logs { t, x, y := log[0], log[1], log[2] - if uf.find(x) == uf.find(y) { - continue - } - uf.union(x, y) - n-- - if n == 1 { - return t + if uf.union(x, y) { + n-- + if n == 1 { + return t + } } } return -1 } ``` +### **TypeScript** + +```ts +function earliestAcq(logs: number[][], n: number): number { + const p: number[] = Array(n) + .fill(0) + .map((_, i) => i); + const find = (x: number): number => { + if (p[x] !== x) { + p[x] = find(p[x]); + } + return p[x]; + }; + logs.sort((a, b) => a[0] - b[0]); + for (const [t, x, y] of logs) { + const rx = find(x); + const ry = find(y); + if (rx !== ry) { + p[rx] = ry; + if (--n === 1) { + return t; + } + } + } + return -1; +} +``` + +```ts +class UnionFind { + private p: number[]; + private size: number[]; + + constructor(n: number) { + this.p = Array(n) + .fill(0) + .map((_, i) => i); + this.size = Array(n).fill(1); + } + + find(x: number): number { + if (this.p[x] !== x) { + this.p[x] = this.find(this.p[x]); + } + return this.p[x]; + } + + union(a: number, b: number): boolean { + const pa = this.find(a); + const pb = this.find(b); + if (pa === pb) { + return false; + } + if (this.size[pa] > this.size[pb]) { + this.p[pb] = pa; + this.size[pa] += this.size[pb]; + } else { + this.p[pa] = pb; + this.size[pb] += this.size[pa]; + } + return true; + } +} + +function earliestAcq(logs: number[][], n: number): number { + logs.sort((a, b) => a[0] - b[0]); + const uf = new UnionFind(n); + for (const [t, x, y] of logs) { + if (uf.union(x, y) && --n === 1) { + return t; + } + } + return -1; +} +``` + +### **Rust** + +```rust +struct UnionFind { + p: Vec, + size: Vec, +} + +impl UnionFind { + fn new(n: usize) -> Self { + let p: Vec = (0..n).collect(); + let size = vec![1; n]; + UnionFind { p, size } + } + + fn find(&mut self, x: usize) -> usize { + if self.p[x] != x { + self.p[x] = self.find(self.p[x]); + } + self.p[x] + } + + fn union(&mut self, a: usize, b: usize) -> bool { + let pa = self.find(a); + let pb = self.find(b); + if pa == pb { + false + } else if self.size[pa] > self.size[pb] { + self.p[pb] = pa; + self.size[pa] += self.size[pb]; + true + } else { + self.p[pa] = pb; + self.size[pb] += self.size[pa]; + true + } + } +} + +impl Solution { + pub fn earliest_acq(logs: Vec>, n: i32) -> i32 { + let mut logs = logs; + logs.sort_by(|a, b| a[0].cmp(&b[0])); + let mut uf = UnionFind::new(n as usize); + let mut n = n; + for log in logs { + let t = log[0]; + let x = log[1] as usize; + let y = log[2] as usize; + if uf.union(x, y) { + n -= 1; + if n == 1 { + return t; + } + } + } + -1 + } +} +``` + ### **...** ``` diff --git a/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/README_EN.md b/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/README_EN.md index 07e6d10877a0a..f97d0f24433cb 100644 --- a/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/README_EN.md +++ b/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/README_EN.md @@ -82,36 +82,38 @@ class Solution: ```python class UnionFind: + __slots__ = ('p', 'size') + def __init__(self, n): self.p = list(range(n)) self.size = [1] * n - def find(self, x): + def find(self, x: int) -> int: if self.p[x] != x: self.p[x] = self.find(self.p[x]) return self.p[x] - def union(self, a, b): + def union(self, a: int, b: int) -> bool: pa, pb = self.find(a), self.find(b) - if pa != pb: - if self.size[pa] > self.size[pb]: - self.p[pb] = pa - self.size[pa] += self.size[pb] - else: - self.p[pa] = pb - self.size[pb] += self.size[pa] + if pa == pb: + return False + if self.size[pa] > self.size[pb]: + self.p[pb] = pa + self.size[pa] += self.size[pb] + else: + self.p[pa] = pb + self.size[pb] += self.size[pa] + return True class Solution: def earliestAcq(self, logs: List[List[int]], n: int) -> int: uf = UnionFind(n) for t, x, y in sorted(logs): - if uf.find(x) == uf.find(y): - continue - uf.union(x, y) - n -= 1 - if n == 1: - return t + if uf.union(x, y): + n -= 1 + if n == 1: + return t return -1 ``` @@ -170,17 +172,19 @@ class UnionFind { return p[x]; } - public void union(int a, int b) { + public boolean union(int a, int b) { int pa = find(a), pb = find(b); - if (pa != pb) { - if (size[pa] > size[pb]) { - p[pb] = pa; - size[pa] += size[pb]; - } else { - p[pa] = pb; - size[pb] += size[pa]; - } + if (pa == pb) { + return false; + } + if (size[pa] > size[pb]) { + p[pb] = pa; + size[pa] += size[pb]; + } else { + p[pa] = pb; + size[pb] += size[pa]; } + return true; } } @@ -190,11 +194,7 @@ class Solution { UnionFind uf = new UnionFind(n); for (int[] log : logs) { int t = log[0], x = log[1], y = log[2]; - if (uf.find(x) == uf.find(y)) { - continue; - } - uf.union(x, y); - if (--n == 1) { + if (uf.union(x, y) && --n == 1) { return t; } } @@ -240,17 +240,19 @@ public: iota(p.begin(), p.end(), 0); } - void unite(int a, int b) { + bool unite(int a, int b) { int pa = find(a), pb = find(b); - if (pa != pb) { - if (size[pa] > size[pb]) { - p[pb] = pa; - size[pa] += size[pb]; - } else { - p[pa] = pb; - size[pb] += size[pa]; - } + if (pa == pb) { + return false; } + if (size[pa] > size[pb]) { + p[pb] = pa; + size[pa] += size[pb]; + } else { + p[pa] = pb; + size[pb] += size[pa]; + } + return true; } int find(int x) { @@ -271,11 +273,7 @@ public: UnionFind uf(n); for (auto& log : logs) { int t = log[0], x = log[1], y = log[2]; - if (uf.find(x) == uf.find(y)) { - continue; - } - uf.unite(x, y); - if (--n == 1) { + if (uf.unite(x, y) && --n == 1) { return t; } } @@ -337,17 +335,19 @@ func (uf *unionFind) find(x int) int { return uf.p[x] } -func (uf *unionFind) union(a, b int) { +func (uf *unionFind) union(a, b int) bool { pa, pb := uf.find(a), uf.find(b) - if pa != pb { - if uf.size[pa] > uf.size[pb] { - uf.p[pb] = pa - uf.size[pa] += uf.size[pb] - } else { - uf.p[pa] = pb - uf.size[pb] += uf.size[pa] - } + if pa == pb { + return false + } + if uf.size[pa] > uf.size[pb] { + uf.p[pb] = pa + uf.size[pa] += uf.size[pb] + } else { + uf.p[pa] = pb + uf.size[pb] += uf.size[pa] } + return true } func earliestAcq(logs [][]int, n int) int { @@ -355,19 +355,154 @@ func earliestAcq(logs [][]int, n int) int { uf := newUnionFind(n) for _, log := range logs { t, x, y := log[0], log[1], log[2] - if uf.find(x) == uf.find(y) { - continue - } - uf.union(x, y) - n-- - if n == 1 { - return t + if uf.union(x, y) { + n-- + if n == 1 { + return t + } } } return -1 } ``` +### **TypeScript** + +```ts +function earliestAcq(logs: number[][], n: number): number { + const p: number[] = Array(n) + .fill(0) + .map((_, i) => i); + const find = (x: number): number => { + if (p[x] !== x) { + p[x] = find(p[x]); + } + return p[x]; + }; + logs.sort((a, b) => a[0] - b[0]); + for (const [t, x, y] of logs) { + const rx = find(x); + const ry = find(y); + if (rx !== ry) { + p[rx] = ry; + if (--n === 1) { + return t; + } + } + } + return -1; +} +``` + +```ts +class UnionFind { + private p: number[]; + private size: number[]; + + constructor(n: number) { + this.p = Array(n) + .fill(0) + .map((_, i) => i); + this.size = Array(n).fill(1); + } + + find(x: number): number { + if (this.p[x] !== x) { + this.p[x] = this.find(this.p[x]); + } + return this.p[x]; + } + + union(a: number, b: number): boolean { + const pa = this.find(a); + const pb = this.find(b); + if (pa === pb) { + return false; + } + if (this.size[pa] > this.size[pb]) { + this.p[pb] = pa; + this.size[pa] += this.size[pb]; + } else { + this.p[pa] = pb; + this.size[pb] += this.size[pa]; + } + return true; + } +} + +function earliestAcq(logs: number[][], n: number): number { + logs.sort((a, b) => a[0] - b[0]); + const uf = new UnionFind(n); + for (const [t, x, y] of logs) { + if (uf.union(x, y) && --n === 1) { + return t; + } + } + return -1; +} +``` + +### **Rust** + +```rust +struct UnionFind { + p: Vec, + size: Vec, +} + +impl UnionFind { + fn new(n: usize) -> Self { + let p: Vec = (0..n).collect(); + let size = vec![1; n]; + UnionFind { p, size } + } + + fn find(&mut self, x: usize) -> usize { + if self.p[x] != x { + self.p[x] = self.find(self.p[x]); + } + self.p[x] + } + + fn union(&mut self, a: usize, b: usize) -> bool { + let pa = self.find(a); + let pb = self.find(b); + if pa == pb { + false + } else if self.size[pa] > self.size[pb] { + self.p[pb] = pa; + self.size[pa] += self.size[pb]; + true + } else { + self.p[pa] = pb; + self.size[pb] += self.size[pa]; + true + } + } +} + +impl Solution { + pub fn earliest_acq(logs: Vec>, n: i32) -> i32 { + let mut logs = logs; + logs.sort_by(|a, b| a[0].cmp(&b[0])); + let mut uf = UnionFind::new(n as usize); + let mut n = n; + for log in logs { + let t = log[0]; + let x = log[1] as usize; + let y = log[2] as usize; + if uf.union(x, y) { + n -= 1; + if n == 1 { + return t; + } + } + } + -1 + } +} +``` + ### **...** ``` diff --git a/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/Solution.rs b/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/Solution.rs new file mode 100644 index 0000000000000..06822aff5f901 --- /dev/null +++ b/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/Solution.rs @@ -0,0 +1,56 @@ +struct UnionFind { + p: Vec, + size: Vec, +} + +impl UnionFind { + fn new(n: usize) -> Self { + let p: Vec = (0..n).collect(); + let size = vec![1; n]; + UnionFind { p, size } + } + + fn find(&mut self, x: usize) -> usize { + if self.p[x] != x { + self.p[x] = self.find(self.p[x]); + } + self.p[x] + } + + fn union(&mut self, a: usize, b: usize) -> bool { + let pa = self.find(a); + let pb = self.find(b); + if pa == pb { + false + } else if self.size[pa] > self.size[pb] { + self.p[pb] = pa; + self.size[pa] += self.size[pb]; + true + } else { + self.p[pa] = pb; + self.size[pb] += self.size[pa]; + true + } + } +} + +impl Solution { + pub fn earliest_acq(logs: Vec>, n: i32) -> i32 { + let mut logs = logs; + logs.sort_by(|a, b| a[0].cmp(&b[0])); + let mut uf = UnionFind::new(n as usize); + let mut n = n; + for log in logs { + let t = log[0]; + let x = log[1] as usize; + let y = log[2] as usize; + if uf.union(x, y) { + n -= 1; + if n == 1 { + return t; + } + } + } + -1 + } +} diff --git a/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/Solution.ts b/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/Solution.ts new file mode 100644 index 0000000000000..cbff7511c2825 --- /dev/null +++ b/solution/1100-1199/1101.The Earliest Moment When Everyone Become Friends/Solution.ts @@ -0,0 +1,23 @@ +function earliestAcq(logs: number[][], n: number): number { + const p: number[] = Array(n) + .fill(0) + .map((_, i) => i); + const find = (x: number): number => { + if (p[x] !== x) { + p[x] = find(p[x]); + } + return p[x]; + }; + logs.sort((a, b) => a[0] - b[0]); + for (const [t, x, y] of logs) { + const rx = find(x); + const ry = find(y); + if (rx !== ry) { + p[rx] = ry; + if (--n === 1) { + return t; + } + } + } + return -1; +}