LeetCode 题解工作台

引爆最多的炸弹

给你一个炸弹列表。一个炸弹的 爆炸范围 定义为以炸弹为圆心的一个圆。 炸弹用一个下标从 0 开始的二维整数数组 bombs 表示,其中 bombs[i] = [x i , y i , r i ] 。 x i 和 y i 表示第 i 个炸弹的 X 和 Y 坐标, r i 表示爆炸范围的 半径 。 你需…

category

6

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

中等 · 图·DFS·traversal

bolt

答案摘要

我们定义一个长度为 的数组 ,其中 表示炸弹 的爆炸范围内可以引爆的所有炸弹的下标。 然后,我们遍历所有炸弹,对于两个炸弹 $(x_1, y_1, r_1)$ 和 $(x_2, y_2, r_2)$,我们计算它们之间的距离 $\textit{dist} = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}$。如果 $\textit{dist} \leq r_1$,那么…

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 图·DFS·traversal 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个炸弹列表。一个炸弹的 爆炸范围 定义为以炸弹为圆心的一个圆。

炸弹用一个下标从 0 开始的二维整数数组 bombs 表示,其中 bombs[i] = [xi, yi, ri] 。xi 和 yi 表示第 i 个炸弹的 X 和 Y 坐标,ri 表示爆炸范围的 半径 。

你需要选择引爆 一个 炸弹。当这个炸弹被引爆时,所有 在它爆炸范围内的炸弹都会被引爆,这些炸弹会进一步将它们爆炸范围内的其他炸弹引爆。

给你数组 bombs ,请你返回在引爆 一个 炸弹的前提下,最多 能引爆的炸弹数目。

 

示例 1:

输入:bombs = [[2,1,3],[6,1,4]]
输出:2
解释:
上图展示了 2 个炸弹的位置和爆炸范围。
如果我们引爆左边的炸弹,右边的炸弹不会被影响。
但如果我们引爆右边的炸弹,两个炸弹都会爆炸。
所以最多能引爆的炸弹数目是 max(1, 2) = 2 。

示例 2:

输入:bombs = [[1,1,5],[10,10,5]]
输出:1
解释:
引爆任意一个炸弹都不会引爆另一个炸弹。所以最多能引爆的炸弹数目为 1 。

示例 3:

输入:bombs = [[1,2,3],[2,3,1],[3,4,2],[4,5,3],[5,6,4]]
输出:5
解释:
最佳引爆炸弹为炸弹 0 ,因为:
- 炸弹 0 引爆炸弹 1 和 2 。红色圆表示炸弹 0 的爆炸范围。
- 炸弹 2 引爆炸弹 3 。蓝色圆表示炸弹 2 的爆炸范围。
- 炸弹 3 引爆炸弹 4 。绿色圆表示炸弹 3 的爆炸范围。
所以总共有 5 个炸弹被引爆。

 

提示:

  • 1 <= bombs.length <= 100
  • bombs[i].length == 3
  • 1 <= xi, yi, ri <= 105
lightbulb

解题思路

方法一:BFS

我们定义一个长度为 nn 的数组 gg,其中 g[i]g[i] 表示炸弹 ii 的爆炸范围内可以引爆的所有炸弹的下标。

然后,我们遍历所有炸弹,对于两个炸弹 (x1,y1,r1)(x_1, y_1, r_1)(x2,y2,r2)(x_2, y_2, r_2),我们计算它们之间的距离 dist=(x1x2)2+(y1y2)2\textit{dist} = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}。如果 distr1\textit{dist} \leq r_1,那么炸弹 ii 的爆炸范围内可以引爆炸弹 jj,我们就将 jj 添加到 g[i]g[i] 中。如果 distr2\textit{dist} \leq r_2,那么炸弹 jj 的爆炸范围内可以引爆炸弹 ii,我们就将 ii 添加到 g[j]g[j] 中。

接下来,我们遍历所有炸弹,对于每个炸弹 kk,我们使用广度优先搜索计算炸弹 kk 的爆炸范围内可以引爆的所有炸弹的下标,并记录下来。如果这些炸弹的数量等于 nn,那么我们就可以引爆所有炸弹,直接返回 nn。否则,我们记录下来这些炸弹的数量,并返回最大值。

时间复杂度 O(n3)O(n^3),空间复杂度 O(n2)O(n^2)。其中 nn 为炸弹的数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution:
    def maximumDetonation(self, bombs: List[List[int]]) -> int:
        n = len(bombs)
        g = [[] for _ in range(n)]
        for i in range(n - 1):
            x1, y1, r1 = bombs[i]
            for j in range(i + 1, n):
                x2, y2, r2 = bombs[j]
                dist = hypot(x1 - x2, y1 - y2)
                if dist <= r1:
                    g[i].append(j)
                if dist <= r2:
                    g[j].append(i)
        ans = 0
        for k in range(n):
            vis = {k}
            q = [k]
            for i in q:
                for j in g[i]:
                    if j not in vis:
                        vis.add(j)
                        q.append(j)
            if len(vis) == n:
                return n
            ans = max(ans, len(vis))
        return ans
speed

复杂度分析

指标
时间complexity is O(n^2) for graph construction and O(n*(n+n)) for DFS across n bombs, leading to roughly O(n^2). Space complexity is O(n^2) for the adjacency graph plus O(n) for DFS recursion stack.
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Ask how to represent bomb interactions efficiently as a graph.

  • question_mark

    Check if the candidate considers chain reactions via depth-first traversal.

  • question_mark

    Probe for optimizations to reduce unnecessary repeated DFS computations.

warning

常见陷阱

外企场景
  • error

    Not modeling the problem as a graph and attempting range checks repeatedly.

  • error

    Ignoring cycles or revisiting bombs in DFS, leading to incorrect counts.

  • error

    Failing to compute maximum across all starting bombs rather than just one path.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Consider limiting detonations to bombs within a certain Manhattan distance instead of Euclidean radius.

  • arrow_right_alt

    Calculate minimum number of initial detonations required to trigger all bombs.

  • arrow_right_alt

    Determine which bombs trigger the same maximum chain and report all starting options.

help

常见问题

外企场景

引爆最多的炸弹题解:图·DFS·traversal | LeetCode #2101 中等