leetcode2101. 引爆最多的炸弹


官解

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

建立引爆关系有向图

遍历每对炸弹 ij,如果 i 能引爆 j,则在 edges 中添加相应的边。

广度优先搜索(BFS)

对于每个炸弹 i,使用 BFS 计算从该炸弹出发能够引爆的炸弹数量,并更新最大值 res

代码的关键点

  • 使用 isConnected 函数判断炸弹的引爆关系。
  • 使用 edges 维护引爆关系有向图。
  • 使用 BFS 遍历每个炸弹的引爆关系,计算能够引爆的最大炸弹数量。
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值