Skip to content

Commit 9add58e

Browse files
authored
Create 2709-greatest-common-divisor-traversal.js
1 parent 6924e8b commit 9add58e

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// max number in `nums` is 10^5. Only need primes up to sqrt(10^5) = 316
2+
const primes = [
3+
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
4+
73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
5+
157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233,
6+
239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313,
7+
]
8+
9+
/**
10+
* @param {number[]} nums
11+
* @return {boolean}
12+
*/
13+
const canTraverseAllPairs = function(nums) {
14+
const n = nums.length
15+
const uf = new Array(n).fill(-1)
16+
const primeIdxs = {}
17+
18+
const find = (i) => (uf[i] < 0 ? i : find(uf[i]))
19+
20+
nums.forEach((num, i) => {
21+
// find all prime factors of num
22+
let primeFactors = []
23+
for (let p of primes) {
24+
if (num % p === 0) {
25+
primeFactors.push(p)
26+
while (num % p === 0) num = Math.floor(num / p)
27+
}
28+
}
29+
30+
if (num !== 1) primeFactors.push(num)
31+
32+
for (let factor of primeFactors) {
33+
if (factor in primeIdxs) {
34+
let pi = find(i)
35+
let pj = find(primeIdxs[factor])
36+
// union if not already merged
37+
if (pi !== pj) {
38+
if (uf[pi] > uf[pj]) [pi, pj] = [pj, pi]
39+
uf[pi] += uf[pj]
40+
uf[pj] = pi
41+
}
42+
} else primeIdxs[factor] = i
43+
}
44+
})
45+
46+
return Math.abs(Math.min(...uf)) === n
47+
};

0 commit comments

Comments
 (0)