https://leetcode.com/problems/greatest-common-divisor-traversal/description
2709. Greatest Common Divisor Traversal
给你一个阵列 nums,如果 GCD(nums[i], nums[j]) > 1 表示 i 可以走到 j,求出是否
可以从任意 i 做为起点走到所有 nums。
思路:
1.要判断 i 是不是可以走到所有 j 就是判断 i 和 j 做为点是否连通,可以用并查集去
判断。
2.一开始只能想到O(n^2)的解法(遍历所有 (i, j) 检查GCD,然后并查集的点 merge
),但是测资超大很明显会TLE,果断看hint。
3.hint建议我们把 nums 里面的数字的质数都找出来,如果 GCD(nums[i], nums[j]) > 1
表示他们存在共同质数,我们可以先遍历一次 nums 找出最大数字,然后建质数表。
4.有两个 corner case可以先处理,一个是 n == 1 一定连通,另一个是 nums[i] = 1 一
定不连通(GCD一定 <= 1)。
5.建立一个并查集和一个SET,SET用来记录质数表哪些数字在 nums 里面。
6.遍历质数表,如果遇到当前数字在 nums 里面,就把 nums[i] 的质数 merge 起来。
7.检查所有 nums[i] 的质数是不是彼此都连通,是的话 true 否则 false。
Java Code: