↓快轉到主要內容
  1. LeetCode/

LeetCode 1627: Graph Connectivity With Threshold

·1 分鐘· ·
LeetCode Hard Math Number-Theory Union-Find Array
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: hard 第一次嘗試:2026-09-05

  • 提交紀錄:Time Limit Exceeded → Accepted

解題思路
#

x 和 y 相連 ⇔ 有一個 z > threshold 同時整除兩者。

反過來想:對每個 z > threshold,z, 2z, 3z, ... 這些數全部都相連(它們都被 z 整除)。所以把每個 z 的倍數都跟 z 合併就好。

  • 合併次數是 Σ n / z,調和級數,O(n log n)。
  • threshold == 0 時 z = 1 整除所有數,全部相連。
  • z > n / 2 時 z 沒有其他倍數在範圍內,不用處理。

查詢就是看兩個城市是不是同一個根。

我的嘗試
#

第一版對所有城市兩兩算 GCD,O(n^2 log n),n = 10^4 時 TLE。改成「每個 z 連它的倍數」就 AC 了,44ms。

正確解法
#

class Solution:
    def areConnected(self, n: int, threshold: int, queries: List[List[int]]) -> List[bool]:
        parent = list(range(n + 1))

        def find(a: int) -> int:
            while parent[a] != a:
                parent[a] = parent[parent[a]]
                a = parent[a]
            return a

        for z in range(threshold + 1, n // 2 + 1):
            for multiple in range(2 * z, n + 1, z):  # z 的倍數都相連
                parent[find(multiple)] = find(z)

        return [find(a) == find(b) for a, b in queries]

threshold == 0 時 z 從 1 開始,1 的倍數就是所有數,迴圈自然會把全部連起來,不用另外特判。

複雜度
#

時間 O(n log n · α(n) + q),空間 O(n)。

要特別避免的錯誤
#

  • 兩兩算 GCD:O(n^2)。
  • 條件是 z 嚴格大於 threshold。

面試口說整理
#

我不兩兩算 GCD,而是反過來:對每個大於門檻的 z,它的所有倍數都相連,所以把倍數跟 z 用 Union-Find 合併。合併次數是調和級數 O(n log n),查詢就是比較兩個根。

相關文章

LeetCode 2709: Greatest Common Divisor Traversal
·2 分鐘
LeetCode Hard Math Number-Theory Union-Find Sieve Gcd Array
LeetCode 2709 解題筆記:任兩個 index 都能互通 ⇔ 全部在同一個連通塊;用 SPF 分解質因數,數字跟它的質因數在 Union-Find 裡合併;1 要特別處理
LeetCode 952: Largest Component Size by Common Factor
·2 分鐘
LeetCode Hard Math Number-Theory Union-Find Hash-Table Array
LeetCode 952 解題筆記:有共同因數 ⇔ 有共同的質因數;把每個數分解質因數,同一個質因數的 index 用 Union-Find 合併,不用兩兩算 GCD
LeetCode 3873: Maximum Points Activated with One Addition
·1 分鐘
LeetCode Hard Union-Find Hash-Table Array
LeetCode 3873 解題筆記:同 x 或同 y 的點用 Union-Find 合併成塊;新加的點最多接上兩塊,答案是最大的兩塊加 1
LeetCode 2382: Maximum Segment Sum After Removals
·1 分鐘
LeetCode Hard Union-Find Prefix-Sum Ordered-Set Array
LeetCode 2382 解題筆記:倒著做,把刪除變成加回去;Union-Find 的根記區段總和,最大值只會變大
LeetCode 927: Three Equal Parts
·2 分鐘
LeetCode Hard Math Array
LeetCode 927 解題筆記:三段的 1 一樣多,先數 1;第三段一定延伸到陣列尾端,它的長度決定每段要比對的內容,再檢查三段的位置不重疊
LeetCode 204: Count Primes
·1 分鐘
LeetCode Medium Array Math Enumeration Number-Theory
LeetCode 204 解題筆記:埃氏篩,只用質數 p 從 p² 開始把倍數劃掉,外層只要到 √n