官解
class Solution:
def maximumDetonation(self, bombs: List[List[int]]) -> int:
n = len(bombs) # 炸弹的数量
# 判断炸弹 u 能否引爆炸弹 v
def 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] = True
while q:
cidx = q.popleft()
for nidx in edges[cidx]:
if visited[nidx]:
continue
cnt += 1
q.append(nidx)
visited[nidx] = True
res = 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 遍历每个炸弹的引爆关系,计算能够引爆的最大炸弹数量。