有 n 座城市,编号从 1 到 n 。编号为 x 和 y 的两座城市直接连通的前提是: x 和 y 的公因数中,至少有一个 严格大于 某个阈值 threshold 。更正式地说,如果存在整数 z ,且满足以下所有条件,则编号 x 和 y 的城市之间有一条道路:
x % z == 0
y % z == 0
z > threshold
给你两个整数 n 和 threshold ,以及一个待查询数组,请你判断每个查询 queries[i] = [ai, bi] 指向的城市 ai 和 bi 是否连通(即,它们之间是否存在一条路径)。
返回数组 answer ,其中answer.length == queries.length 。如果第 i 个查询中指向的城市 ai 和 bi 连通,则 answer[i] 为 true ;如果不连通,则 answer[i] 为 false 。
不要一个查询一个查询地去判断,首先把整个图构造出来,构造出图之后都好解决了。
from typing import *
import math
class Solution:
def __init__(self):
self.arr = None
def areConnected(self, n: int, threshold: int, queries: List[List[int]]) -> List[bool]:
self.arr = [i for i in range(n + 1)]
for k in range(threshold + 1, n // 2 + 1):
i = 1
while (i + 1) * k <= n:
# 进行合并,没必要合并所有的边
self.set_union(i * k, (i + 1) * k)
i += 1
return [self.find(query[0]) == self.find(query[1]) for query in queries]
def set_union(self, i, j):
find_i = self.find(i)
find_j = self.find(j)
if find_j != find_i:
self.arr[find_j] = find_i
def find(self, i):
if i != self.arr[i]:
self.arr[i] = self.find(self.arr[i])
return self.arr[i]