class Solution {
public:
int largestComponentSize(vector<int>& nums) {
}
};
952. 按公因数计算最大组件大小
给定一个由不同正整数的组成的非空数组 nums
,考虑下面的图:
nums.length
个节点,按从 nums[0]
到 nums[nums.length - 1]
标记;nums[i]
和 nums[j]
共用一个大于 1 的公因数时,nums[i]
和 nums[j]
之间才有一条边。返回 图中最大连通组件的大小 。
示例 1:
输入:nums = [4,6,15,35] 输出:4
示例 2:
输入:nums = [20,50,9,63] 输出:2
示例 3:
输入:nums = [2,3,6,7,4,12,21,39] 输出:8
提示:
1 <= nums.length <= 2 * 104
1 <= nums[i] <= 105
nums
中所有值都 不同原站题解
golang 解法, 执行用时: 200 ms, 内存消耗: 9 MB, 提交时间: 2023-06-26 09:24:51
type unionFind struct { parent, rank []int } func newUnionFind(n int) unionFind { parent := make([]int, n) for i := range parent { parent[i] = i } return unionFind{parent, make([]int, n)} } func (uf unionFind) find(x int) int { if uf.parent[x] != x { uf.parent[x] = uf.find(uf.parent[x]) } return uf.parent[x] } func (uf unionFind) merge(x, y int) { x, y = uf.find(x), uf.find(y) if x == y { return } if uf.rank[x] > uf.rank[y] { uf.parent[y] = x } else if uf.rank[x] < uf.rank[y] { uf.parent[x] = y } else { uf.parent[y] = x uf.rank[x]++ } } func largestComponentSize(nums []int) (ans int) { m := 0 for _, num := range nums { m = max(m, num) } uf := newUnionFind(m + 1) for _, num := range nums { for i := 2; i*i <= num; i++ { if num%i == 0 { uf.merge(num, i) uf.merge(num, num/i) } } } cnt := make([]int, m+1) for _, num := range nums { rt := uf.find(num) cnt[rt]++ ans = max(ans, cnt[rt]) } return } func max(a, b int) int { if b > a { return b } return a }
javascript 解法, 执行用时: 680 ms, 内存消耗: 73 MB, 提交时间: 2023-06-26 09:24:29
/** * @param {number[]} nums * @return {number} */ var largestComponentSize = function(nums) { const m = _.max(nums);; const uf = new UnionFind(m + 1); for (const num of nums) { for (let i = 2; i * i <= num; i++) { if (num % i === 0) { uf.union(num, i); uf.union(num, Math.floor(num / i)); } } } const counts = new Array(m + 1).fill(0); let ans = 0; for (let num of nums) { const root = uf.find(num); counts[root]++; ans = Math.max(ans, counts[root]); } return ans; }; class UnionFind { constructor(n) { this.parent = new Array(n).fill(0).map((_, i) => i); this.rank = new Array(n).fill(0); } union(x, y) { let rootx = this.find(x); let rooty = this.find(y); if (rootx !== rooty) { if (this.rank[rootx] > this.rank[rooty]) { this.parent[rooty] = rootx; } else if (this.rank[rootx] < this.rank[rooty]) { this.parent[rootx] = rooty; } else { this.parent[rooty] = rootx; this.rank[rootx]++; } } } find(x) { if (this.parent[x] !== x) { this.parent[x] = this.find(this.parent[x]); } return this.parent[x]; } }
java 解法, 执行用时: 109 ms, 内存消耗: 45.1 MB, 提交时间: 2023-06-26 09:24:09
class Solution { public int largestComponentSize(int[] nums) { int m = Arrays.stream(nums).max().getAsInt(); UnionFind uf = new UnionFind(m + 1); for (int num : nums) { for (int i = 2; i * i <= num; i++) { if (num % i == 0) { uf.union(num, i); uf.union(num, num / i); } } } int[] counts = new int[m + 1]; int ans = 0; for (int num : nums) { int root = uf.find(num); counts[root]++; ans = Math.max(ans, counts[root]); } return ans; } } class UnionFind { int[] parent; int[] rank; public UnionFind(int n) { parent = new int[n]; for (int i = 0; i < n; i++) { parent[i] = i; } rank = new int[n]; } public void union(int x, int y) { int rootx = find(x); int rooty = find(y); if (rootx != rooty) { if (rank[rootx] > rank[rooty]) { parent[rooty] = rootx; } else if (rank[rootx] < rank[rooty]) { parent[rootx] = rooty; } else { parent[rooty] = rootx; rank[rootx]++; } } } public int find(int x) { if (parent[x] != x) { parent[x] = find(parent[x]); } return parent[x]; } }
python3 解法, 执行用时: 3512 ms, 内存消耗: 22.3 MB, 提交时间: 2023-06-26 09:23:42
'''并查集''' class UnionFind: def __init__(self, n: int): self.parent = list(range(n)) self.rank = [0] * n def find(self, x: int) -> int: if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) return self.parent[x] def merge(self, x: int, y: int) -> None: x, y = self.find(x), self.find(y) if x == y: return if self.rank[x] > self.rank[y]: self.parent[y] = x elif self.rank[x] < self.rank[y]: self.parent[x] = y else: self.parent[y] = x self.rank[x] += 1 class Solution: def largestComponentSize(self, nums: List[int]) -> int: uf = UnionFind(max(nums) + 1) for num in nums: i = 2 while i * i <= num: if num % i == 0: uf.merge(num, i) uf.merge(num, num // i) i += 1 return max(Counter(uf.find(num) for num in nums).values())