官解
class Solution:def maximumDetonation(self, bombs: List[List[int]]) -> int:n = len(bombs) # 炸弹的数量# 判断炸弹 u 能否引爆炸弹 vdef isConnected(u: int, v: int) -> bool:dx = bombs[u][0] - bombs[v][0]dy = bombs[u][1] - bombs[v][1]return bombs[u][2] ** 2 >= dx ** 2 + dy ** 2# 维护引爆关系有向图edges = defaultdict(list)for i in range(n):for j in range(n):if i != j and isConnected(i, j):edges[i].append(j)res = 0 # 最多引爆数量for i in range(n):# 遍历每个炸弹,广度优先搜索计算该炸弹可引爆的数量,并维护最大值visited = [False] * n # 记录每个炸弹是否被引爆cnt = 1 # 当前炸弹能够引爆的数量q = deque([i])visited[i] = Truewhile q:cidx = q.popleft()for nidx in edges[cidx]:if visited[nidx]:continuecnt += 1q.append(nidx)visited[nidx] = Trueres = max(res, cnt) # 更新最大引爆数量return res # 返回最终结果
chatgpt
这段代码实现了一个名为 maximumDetonation
的方法,用于计算给定炸弹数组中,最多能够引爆的炸弹数量。该方法使用广度优先搜索(BFS)来遍历炸弹的引爆关系图,找出从每个炸弹出发能够引爆的最大炸弹数量。
代码分解与解释
变量和数据结构
bombs: List[List[int]]
:炸弹的列表,每个炸弹由其位置坐标和引爆半径[x, y, r]
表示。n = len(bombs)
:炸弹的数量。edges = defaultdict(list)
:引爆关系有向图,edges[i]
表示能够被炸弹i
引爆的炸弹列表。res = 0
:用于存储最终结果,即最多能够引爆的炸弹数量。
函数 isConnected(u: int, v: int) -> bool
该函数用于判断炸弹 u
能否引爆炸弹 v
,如果炸弹 v
在炸弹 u
的引爆半径范围内,则返回 True
,否则返回 False
。
建立引爆关系有向图
遍历每对炸弹 i
和 j
,如果 i
能引爆 j
,则在 edges
中添加相应的边。
广度优先搜索(BFS)
对于每个炸弹 i
,使用 BFS 计算从该炸弹出发能够引爆的炸弹数量,并更新最大值 res
。
代码的关键点
- 使用
isConnected
函数判断炸弹的引爆关系。 - 使用
edges
维护引爆关系有向图。 - 使用 BFS 遍历每个炸弹的引爆关系,计算能够引爆的最大炸弹数量。