From cfd09b680867ee962be94e36bcb693cd072c194c Mon Sep 17 00:00:00 2001 From: Shahriar Shatil <52494840+ShatilKhan@users.noreply.github.com> Date: Sun, 25 Feb 2024 16:38:04 +0600 Subject: [PATCH] Time: 367 ms (60.00%) | Memory: 68.3 MB (60.00%) - LeetSync --- .../greatest-common-divisor-traversal.js | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 2827-greatest-common-divisor-traversal/greatest-common-divisor-traversal.js diff --git a/2827-greatest-common-divisor-traversal/greatest-common-divisor-traversal.js b/2827-greatest-common-divisor-traversal/greatest-common-divisor-traversal.js new file mode 100644 index 0000000..7fc073f --- /dev/null +++ b/2827-greatest-common-divisor-traversal/greatest-common-divisor-traversal.js @@ -0,0 +1,58 @@ +/** + * @param {number[]} nums + * @return {boolean} + */ +var canTraverseAllPairs = function(nums) { + const numElements = nums.length; + if (numElements === 1) return true; + + const disjointSet = Array.from({ length: numElements }, (_, index) => index); + const setSize = Array(numElements).fill(1); + const factorFirstOccurrence = new Map(); + + function findSetLeader(x) { + if (disjointSet[x] === x) return x; + disjointSet[x] = findSetLeader(disjointSet[x]); + return disjointSet[x]; + } + + function unionSets(x, y) { + const xLeader = findSetLeader(x); + const yLeader = findSetLeader(y); + if (xLeader === yLeader) return; + if (setSize[xLeader] < setSize[yLeader]) { + disjointSet[xLeader] = yLeader; + setSize[yLeader] += setSize[xLeader]; + } else { + disjointSet[yLeader] = xLeader; + setSize[xLeader] += setSize[yLeader]; + } + } + + for (let i = 0; i < numElements; i++) { + let num = nums[i]; + let divisor = 2; + while (divisor * divisor <= num) { + if (num % divisor === 0) { + if (factorFirstOccurrence.has(divisor)) { + unionSets(i, factorFirstOccurrence.get(divisor)); + } else { + factorFirstOccurrence.set(divisor, i); + } + while (num % divisor === 0) { + num /= divisor; + } + } + divisor++; + } + if (num > 1) { + if (factorFirstOccurrence.has(num)) { + unionSets(i, factorFirstOccurrence.get(num)); + } else { + factorFirstOccurrence.set(num, i); + } + } + } + + return setSize[findSetLeader(0)] === numElements; +}; \ No newline at end of file