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 112c723

Browse files
feat: add solutions to lc problem: No. 3378 (doocs#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)

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