Skip to content

Commit 112c723

Browse files
authored
feat: add solutions to lc problem: No. 3378 (#3937)
1 parent 04070a3 commit 112c723

File tree

10 files changed

+1119
-8
lines changed

10 files changed

+1119
-8
lines changed

solution/3300-3399/3378.Count Connected Components in LCM Graph/README.md

Lines changed: 383 additions & 4 deletions
Large diffs are not rendered by default.

solution/3300-3399/3378.Count Connected Components in LCM Graph/README_EN.md

Lines changed: 383 additions & 4 deletions
Large diffs are not rendered by default.
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
typedef struct DSU {
2+
unordered_map<int, int> par, rank;
3+
DSU(int n) {
4+
for (int i = 0; i < n; ++i) {
5+
par[i] = i;
6+
rank[i] = 0;
7+
}
8+
}
9+
10+
void makeSet(int v) {
11+
par[v] = v;
12+
rank[v] = 1;
13+
}
14+
15+
int find(int x) {
16+
if (par[x] == x) {
17+
return x;
18+
}
19+
return par[x] = find(par[x]);
20+
}
21+
22+
void unionSet(int u, int v) {
23+
u = find(u);
24+
v = find(v);
25+
if (u != v) {
26+
if (rank[u] < rank[v]) swap(u, v);
27+
par[v] = u;
28+
if (rank[u] == rank[v]) rank[u]++;
29+
}
30+
}
31+
} DSU;
32+
33+
class Solution {
34+
public:
35+
int countComponents(vector<int>& nums, int threshold) {
36+
DSU dsu(threshold);
37+
for (auto& num : nums) {
38+
for (int j = num; j <= threshold; j += num) {
39+
dsu.unionSet(num, j);
40+
}
41+
}
42+
unordered_set<int> par;
43+
for (auto& num : nums) {
44+
if (num > threshold) {
45+
par.insert(num);
46+
} else {
47+
par.insert(dsu.find(num));
48+
}
49+
}
50+
return par.size();
51+
}
52+
};
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
type DSU struct {
2+
parent map[int]int
3+
rank map[int]int
4+
}
5+
6+
func NewDSU(n int) *DSU {
7+
dsu := &DSU{
8+
parent: make(map[int]int),
9+
rank: make(map[int]int),
10+
}
11+
for i := 0; i <= n; i++ {
12+
dsu.parent[i] = i
13+
dsu.rank[i] = 0
14+
}
15+
return dsu
16+
}
17+
18+
func (dsu *DSU) Find(x int) int {
19+
if dsu.parent[x] != x {
20+
dsu.parent[x] = dsu.Find(dsu.parent[x])
21+
}
22+
return dsu.parent[x]
23+
}
24+
25+
func (dsu *DSU) Union(u, v int) {
26+
uRoot := dsu.Find(u)
27+
vRoot := dsu.Find(v)
28+
if uRoot != vRoot {
29+
if dsu.rank[uRoot] < dsu.rank[vRoot] {
30+
uRoot, vRoot = vRoot, uRoot
31+
}
32+
dsu.parent[vRoot] = uRoot
33+
if dsu.rank[uRoot] == dsu.rank[vRoot] {
34+
dsu.rank[uRoot]++
35+
}
36+
}
37+
}
38+
39+
func countComponents(nums []int, threshold int) int {
40+
dsu := NewDSU(threshold)
41+
42+
for _, num := range nums {
43+
for j := num; j <= threshold; j += num {
44+
dsu.Union(num, j)
45+
}
46+
}
47+
48+
uniqueParents := make(map[int]struct{})
49+
for _, num := range nums {
50+
if num > threshold {
51+
uniqueParents[num] = struct{}{}
52+
} else {
53+
uniqueParents[dsu.Find(num)] = struct{}{}
54+
}
55+
}
56+
57+
return len(uniqueParents)
58+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
class DSU {
2+
private Map<Integer, Integer> parent;
3+
private Map<Integer, Integer> rank;
4+
5+
public DSU(int n) {
6+
parent = new HashMap<>();
7+
rank = new HashMap<>();
8+
for (int i = 0; i <= n; i++) {
9+
parent.put(i, i);
10+
rank.put(i, 0);
11+
}
12+
}
13+
14+
public void makeSet(int v) {
15+
parent.put(v, v);
16+
rank.put(v, 1);
17+
}
18+
19+
public int find(int x) {
20+
if (parent.get(x) != x) {
21+
parent.put(x, find(parent.get(x)));
22+
}
23+
return parent.get(x);
24+
}
25+
26+
public void unionSet(int u, int v) {
27+
u = find(u);
28+
v = find(v);
29+
if (u != v) {
30+
if (rank.get(u) < rank.get(v)) {
31+
int temp = u;
32+
u = v;
33+
v = temp;
34+
}
35+
parent.put(v, u);
36+
if (rank.get(u).equals(rank.get(v))) {
37+
rank.put(u, rank.get(u) + 1);
38+
}
39+
}
40+
}
41+
}
42+
43+
class Solution {
44+
public int countComponents(int[] nums, int threshold) {
45+
DSU dsu = new DSU(threshold);
46+
47+
for (int num : nums) {
48+
for (int j = num; j <= threshold; j += num) {
49+
dsu.unionSet(num, j);
50+
}
51+
}
52+
53+
Set<Integer> uniqueParents = new HashSet<>();
54+
for (int num : nums) {
55+
if (num > threshold) {
56+
uniqueParents.add(num);
57+
} else {
58+
uniqueParents.add(dsu.find(num));
59+
}
60+
}
61+
62+
return uniqueParents.size();
63+
}
64+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
class DSU:
2+
def __init__(self, n):
3+
self.parent = {i: i for i in range(n)}
4+
self.rank = {i: 0 for i in range(n)}
5+
6+
def make_set(self, v):
7+
self.parent[v] = v
8+
self.rank[v] = 1
9+
10+
def find(self, x):
11+
if self.parent[x] != x:
12+
self.parent[x] = self.find(self.parent[x])
13+
return self.parent[x]
14+
15+
def union_set(self, u, v):
16+
u = self.find(u)
17+
v = self.find(v)
18+
if u != v:
19+
if self.rank[u] < self.rank[v]:
20+
u, v = v, u
21+
self.parent[v] = u
22+
if self.rank[u] == self.rank[v]:
23+
self.rank[u] += 1
24+
25+
26+
class Solution:
27+
def countComponents(self, nums, threshold):
28+
dsu = DSU(threshold + 1)
29+
30+
for num in nums:
31+
for j in range(num, threshold + 1, num):
32+
dsu.union_set(num, j)
33+
34+
unique_parents = set()
35+
for num in nums:
36+
if num > threshold:
37+
unique_parents.add(num)
38+
else:
39+
unique_parents.add(dsu.find(num))
40+
41+
return len(unique_parents)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class Solution {
2+
private:
3+
void dfs(int node, vector<vector<int>>& adj, vector<bool>& vis) {
4+
if (vis[node]) return;
5+
vis[node] = true;
6+
for (auto& u : adj[node]) {
7+
dfs(u, adj, vis);
8+
}
9+
}
10+
11+
public:
12+
int countComponents(vector<int>& nums, int threshold) {
13+
vector<vector<int>> adj(threshold + 1);
14+
vector<bool> vis(threshold + 1, false);
15+
int ans = 0;
16+
for (auto& num : nums) {
17+
if (num > threshold) {
18+
++ans;
19+
continue;
20+
}
21+
for (int j = 2 * num; j <= threshold; j += num) {
22+
adj[num].push_back(j);
23+
adj[j].push_back(num);
24+
}
25+
}
26+
for (auto& num : nums) {
27+
if (num <= threshold && !vis[num]) {
28+
dfs(num, adj, vis);
29+
++ans;
30+
}
31+
}
32+
return ans;
33+
}
34+
};
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
func dfs(node int, adj [][]int, visited []bool) {
2+
if visited[node] {
3+
return
4+
}
5+
visited[node] = true
6+
for _, neighbor := range adj[node] {
7+
dfs(neighbor, adj, visited)
8+
}
9+
}
10+
11+
func countComponents(nums []int, threshold int) int {
12+
adj := make([][]int, threshold+1)
13+
for i := range adj {
14+
adj[i] = []int{}
15+
}
16+
17+
visited := make([]bool, threshold+1)
18+
components := 0
19+
20+
for _, num := range nums {
21+
if num > threshold {
22+
components++
23+
continue
24+
}
25+
for j := 2 * num; j <= threshold; j += num {
26+
adj[num] = append(adj[num], j)
27+
adj[j] = append(adj[j], num)
28+
}
29+
}
30+
31+
for _, num := range nums {
32+
if num <= threshold && !visited[num] {
33+
dfs(num, adj, visited)
34+
components++
35+
}
36+
}
37+
38+
return components
39+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution {
2+
private void dfs(int node, List<List<Integer>> adj, boolean[] visited) {
3+
if (visited[node]) return;
4+
visited[node] = true;
5+
for (int neighbor : adj.get(node)) {
6+
dfs(neighbor, adj, visited);
7+
}
8+
}
9+
10+
public int countComponents(int[] nums, int threshold) {
11+
List<List<Integer>> adj = new ArrayList<>();
12+
for (int i = 0; i <= threshold; i++) {
13+
adj.add(new ArrayList<>());
14+
}
15+
boolean[] visited = new boolean[threshold + 1];
16+
int ans = 0;
17+
18+
for (int num : nums) {
19+
if (num > threshold) {
20+
ans++;
21+
continue;
22+
}
23+
for (int j = 2 * num; j <= threshold; j += num) {
24+
adj.get(num).add(j);
25+
adj.get(j).add(num);
26+
}
27+
}
28+
29+
for (int num : nums) {
30+
if (num <= threshold && !visited[num]) {
31+
dfs(num, adj, visited);
32+
ans++;
33+
}
34+
}
35+
36+
return ans;
37+
}
38+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution:
2+
def dfs(self, node, adj, vis):
3+
if vis[node]:
4+
return
5+
vis[node] = True
6+
for neighbor in adj[node]:
7+
self.dfs(neighbor, adj, vis)
8+
9+
def countComponents(self, nums, threshold):
10+
adj = [[] for _ in range(threshold + 1)]
11+
vis = [False] * (threshold + 1)
12+
ans = 0
13+
14+
for num in nums:
15+
if num > threshold:
16+
ans += 1
17+
continue
18+
for j in range(2 * num, threshold + 1, num):
19+
adj[num].append(j)
20+
adj[j].append(num)
21+
22+
for num in nums:
23+
if num <= threshold and not vis[num]:
24+
self.dfs(num, adj, vis)
25+
ans += 1
26+
27+
return ans

0 commit comments

Comments
 (0)