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: