Detonate the Maximum Bombs solution and explanation
9 more videos on this problem
Detonate the Maximum Bombs - Leetcode 2101 - PythonNeetCodeIO · 11:20 · 18K views
Detonate the Maximum Bombs | DFS | BFS | GOOGLE | Leetcode-2101 | Live Code + Explanation 🧑🏻💻codestorywithMIK · 25:49 · 10K views
Detonate the Maximum Bombs || Math || Graph || How to think of Graph || Leetcode 2101Aryan Mittal · 16:12 · 5K views
Detonate the Maximum Bombs | Leetcode 2101 | Live coding session 🔥🔥🔥🔥| BFS/DFS traversal | Contest67Coding Decoded · 12:08 · 3K views
DETONATE THE MAXIMUM BOMBS | LEETCODE 2101 | PYTHON GRAPH SOLUTIONCracking FAANG · 11:12 · 2K views
2101. Detonate the Maximum Bombs | Recursion | BFS | LeetCode Daily ChallengeDeep Tech · 16:36 · 905 views
2101. Detonate the Maximum Bombs (Leetcode Medium)Programming Live with Larry · 12:59 · 804 views
Detonate the Maximum Bombs - Leetcode 2101 - JavaRaihanul Alam Hridoy · 28:23 · 633 views
Daily Leetcode #1158: Jun 02, 2023 - 2101. Detonate the Maximum BombsProgramming Live with Larry · 7:05 · 294 views
Explaining Leetcode - #2101 Detonate the Maximum Bombs (Medium) - 2 approachesJTECH · 32:59 · 288 views
The problem
You are given a list of bombs. The range of a bomb is defined as the area where its effect can be felt. This area is in the shape of a circle with the center as the location of the bomb.
The bombs are represented by a 0-indexed 2D integer array bombs where bombs[i] = [xi, yi, ri]. xi and yi denote the X-coordinate and Y-coordinate of the location of the ith bomb, whereas ri denotes the radius of its range.
You may choose to detonate a single bomb. When a bomb is detonated, it will detonate all bombs that lie in its range. These bombs will further detonate the bombs that lie in their ranges.
Given the list of bombs, return the maximum number of bombs that can be detonated if you are allowed to detonate only one bomb.
Example 1:
Input: bombs = [[2,1,3],[6,1,4]] Output: 2 Explanation: The above figure shows the positions and ranges of the 2 bombs. If we detonate the left bomb, the right bomb will not be affected. But if we detonate the right bomb, both bombs will be detonated. So the maximum bombs that can be detonated is max(1, 2) = 2.
Example 2:
Input: bombs = [[1,1,5],[10,10,5]] Output: 1 Explanation: Detonating either bomb will not detonate the other bomb, so the maximum number of bombs that can be detonated is 1.
Example 3:
Input: bombs = [[1,2,3],[2,3,1],[3,4,2],[4,5,3],[5,6,4]] Output: 5 Explanation: The best bomb to detonate is bomb 0 because: - Bomb 0 detonates bombs 1 and 2. The red circle denotes the range of bomb 0. - Bomb 2 detonates bomb 3. The blue circle denotes the range of bomb 2. - Bomb 3 detonates bomb 4. The green circle denotes the range of bomb 3. Thus all 5 bombs are detonated.
Constraints:
1 <= bombs.length <= 100bombs[i].length == 31 <= xi, yi, ri <= 105
Approach overview
Problem Overview: You are given a list of bombs where each bomb has an (x, y) coordinate and a blast radius. If one bomb explodes, it detonates any other bomb inside its radius, potentially causing a chain reaction. The goal is to determine the maximum number of bombs that can explode if you choose the best bomb to detonate first.
Approach 1: Graph Representation with BFS (O(n²) time, O(n²) space)
Model the bombs as a directed graph. Each bomb is a node, and you add a directed edge from bomb i to bomb j if the distance between them is within the blast radius of i. The distance check uses geometry: (x1-x2)^2 + (y1-y2)^2 <= r^2. Building this adjacency list requires checking every pair of bombs, which costs O(n²). After constructing the graph, run a Breadth-First Search from every bomb to simulate the chain reaction and count how many nodes are reachable. Track the maximum visited count across all starting nodes.
BFS works well because the explosion spreads level by level across reachable bombs. A queue stores bombs that get triggered next, and a visited set prevents re-processing the same bomb. Each BFS traversal visits at most n nodes and edges, keeping the total runtime bounded by O(n²).
Approach 2: Graph Representation with DFS (O(n²) time, O(n²) space)
The same graph model can be explored using Depth-First Search. After constructing the adjacency list, start a DFS from each bomb and recursively trigger all bombs reachable through outgoing edges. Maintain a visited set during each traversal to avoid infinite loops and duplicate counts.
DFS explores the entire detonation chain by going as deep as possible before backtracking. Each traversal effectively simulates a full cascade starting from a single bomb. Because the graph contains at most n² edges from pairwise distance checks, the overall complexity remains O(n²) time and O(n²) space for the adjacency list.
The key insight is converting the geometric reachability condition into a directed graph problem. Once the connections are built, the problem reduces to counting reachable nodes using standard graph traversal. Problems combining arrays, geometry distance checks, and graph traversal frequently follow this pattern.
Recommended for interviews: Build the adjacency list and run BFS or DFS from every bomb. Interviewers expect you to recognize the graph structure and use traversal to simulate the chain reaction. Explaining the pairwise distance check shows understanding of the geometry constraint, while implementing BFS or DFS demonstrates strong graph fundamentals.
Approach 1: Graph Representation with BFS
Represent each bomb as a node in a graph. An edge exists from bomb i to bomb j if bomb i can detonate bomb j. The goal is to start from each bomb and use BFS to find how many bombs can be detonated. Return the maximum number of detonatable bombs starting from any single bomb.
from collections import deque
def can_detonate(bomb1, bomb2):
x1, y1, r1 = bomb1
x2, y2, _ = bomb2
return (x1 - x2)**2 + (y1 - y2)**2 <= r1**2
def maximum_detonation(bombs):
n = len(bombs)
graph = [[] for _ in range(n)]
# Build graph
for i in range(n):
for j in range(n):
if i != j and can_detonate(bombs[i], bombs[j]):
graph[i].append(j)
def bfs(start):
visited = [False] * n
queue = deque([start])
visited[start] = True
count = 0
while queue:
current = queue.popleft()
count += 1
for neighbor in graph[current]:
if not visited[neighbor]:
visited[neighbor] = True
queue.append(neighbor)
return count
max_detonated = 0
for i in range(n):
max_detonated = max(max_detonated, bfs(i))
return max_detonatedimport java.util.*;
class Solution {
private boolean canDetonate(int[] bomb1, int[] bomb2) {
long x1 = bomb1[0], y1 = bomb1[1], r1 = bomb1[2];
long x2 = bomb2[0], y2 = bomb2[1];
return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) <= r1 * r1;
}
public int maximumDetonation(int[][] bombs) {
int n = bombs.length;
List<Integer>[] graph = new ArrayList[n];
for (int i = 0; i < n; i++) graph[i] = new ArrayList<>();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i != j && canDetonate(bombs[i], bombs[j])) {
graph[i].add(j);
}
}
}
int maxDetonated = 0;
for (int i = 0; i < n; i++) {
boolean[] visited = new boolean[n];
Queue<Integer> queue = new LinkedList<>();
queue.offer(i);
visited[i] = true;
int count = 0;
while (!queue.isEmpty()) {
int current = queue.poll();
count++;
for (int neighbor : graph[current]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
queue.offer(neighbor);
}
}
}
maxDetonated = Math.max(maxDetonated, count);
}
return maxDetonated;
}
}This code constructs a graph with each bomb as a node and checks if a bomb can detonate another based on their respective ranges. BFS is used from each bomb to determine the total number of bombs that can be detonated, and the maximum among all is returned.
Time Complexity: O(n^2), where n is the number of bombs, as we need to check each pair of bombs.
Space Complexity: O(n), for storing the adjacency list of the graph and the visited list.
Approach 2: Graph Representation with DFS
Another approach to solve this problem is by using a DFS traversal instead of BFS. We use a similar graph representation where each bomb is a node and an edge exists if one bomb can detonate another. The maximum number of bombs that can be reached starting from each node (bomb) is determined using DFS.
#include <vector>
#include <cmath>
using namespace std;
bool canDetonate(const vector<int>& bomb1, const vector<int>& bomb2) {
long long x1 = bomb1[0], y1 = bomb1[1], r1 = bomb1[2];
long long x2 = bomb2[0], y2 = bomb2[1];
return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) <= r1 * r1;
}
void dfs(const vector<vector<int>>& graph, vector<bool>& visited, int index, int& count) {
visited[index] = true;
count++;
for (int neighbor : graph[index]) {
if (!visited[neighbor]) {
dfs(graph, visited, neighbor, count);
}
}
}
int maximumDetonation(vector<vector<int>>& bombs) {
int n = bombs.size();
vector<vector<int>> graph(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i != j && canDetonate(bombs[i], bombs[j])) {
graph[i].push_back(j);
}
}
}
int maxDetonated = 0;
for (int i = 0; i < n; i++) {
vector<bool> visited(n, false);
int count = 0;
dfs(graph, visited, i, count);
maxDetonated = max(maxDetonated, count);
}
return maxDetonated;
}function canDetonate(bomb1, bomb2) {
let [x1, y1, r1] = bomb1;
let [x2, y2] = bomb2;
return (x1 - x2) ** 2 + (y1 - y2) ** 2 <= r1 ** 2;
}
function dfs(graph, visited, index) {
visited[index] = true;
let count = 1;
for (let neighbor of graph[index]) {
if (!visited[neighbor]) {
count += dfs(graph, visited, neighbor);
}
}
return count;
}
function maximumDetonation(bombs) {
let n = bombs.length;
let graph = Array.from({ length: n }, () => []);
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (i !== j && canDetonate(bombs[i], bombs[j])) {
graph[i].push(j);
}
}
}
let maxDetonated = 0;
for (let i = 0; i < n; i++) {
let visited = Array(n).fill(false);
let detonatedCount = dfs(graph, visited, i);
maxDetonated = Math.max(maxDetonated, detonatedCount);
}
return maxDetonated;
}This C++ implementation uses DFS to explore each detonation starting from every bomb and computes the maximum possible detonations. It uses a recursive function to delve deeper into the graph from each bomb until all reachable bombs are visited starting from a given bomb.
Time Complexity: O(n^2) for constructing the graph and performing DFS traversals.
Space Complexity: O(n) used in the recursion stack and the visited vector.
Approach 3: BFS
We define an array g of length n, where g[i] represents the indices of all bombs that can be triggered by bomb i within its explosion range.
Next, we iterate over all bombs. For two bombs (x_1, y_1, r_1) and (x_2, y_2, r_2), we calculate the distance between them dist = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}. If dist leq r_1, then bomb i can trigger bomb j within its explosion range, so we add j to g[i]. If dist leq r_2, then bomb j can trigger bomb i within its explosion range, so we add i to g[j].
Next, we iterate over all bombs. For each bomb k, we use breadth-first search to calculate the indices of all bombs that can be triggered by bomb k within its explosion range and record them. If the number of these bombs equals n, then we can trigger all bombs and directly return n. Otherwise, we record the number of these bombs and return the maximum value.
The time complexity is O(n^3) and the space complexity is O(n^2), where n is the number of bombs.
function maximumDetonation(bombs: number[][]): number {
const n = bombs.length;
const g: number[][] = Array.from({ length: n }, () => []);
for (let i = 0; i < n - 1; ++i) {
const [x1, y1, r1] = bombs[i];
for (let j = i + 1; j < n; ++j) {
const [x2, y2, r2] = bombs[j];
const d = Math.hypot(x1 - x2, y1 - y2);
if (d <= r1) {
g[i].push(j);
}
if (d <= r2) {
g[j].push(i);
}
}
}
let ans = 0;
for (let k = 0; k < n; ++k) {
const vis: Set<number> = new Set([k]);
const q: number[] = [k];
for (const i of q) {
for (const j of g[i]) {
if (!vis.has(j)) {
vis.add(j);
q.push(j);
}
}
}
if (vis.size === n) {
return n;
}
ans = Math.max(ans, vis.size);
}
return ans;
}func maximumDetonation(bombs [][]int) (ans int) {
n := len(bombs)
g := make([][]int, n)
for i, p1 := range bombs[:n-1] {
for j := i + 1; j < n; j++ {
p2 := bombs[j]
dist := math.Hypot(float64(p1[0]-p2[0]), float64(p1[1]-p2[1]))
if dist <= float64(p1[2]) {
g[i] = append(g[i], j)
}
if dist <= float64(p2[2]) {
g[j] = append(g[j], i)
}
}
}
for k := 0; k < n; k++ {
q := []int{k}
vis := make([]bool, n)
vis[k] = true
cnt := 0
for len(q) > 0 {
i := q[0]
q = q[1:]
cnt++
for _, j := range g[i] {
if !vis[j] {
vis[j] = true
q = append(q, j)
}
}
}
if cnt == n {
return n
}
ans = max(ans, cnt)
}
return
}Complexity comparison
| Approach | Complexity |
|---|---|
| Graph Representation with BFS | Time Complexity: O(n^2), where n is the number of bombs, as we need to check each pair of bombs. |
| Graph Representation with DFS | Time Complexity: O(n^2) for constructing the graph and performing DFS traversals. |
| BFS | – |
Complexity analysis
| Approach | Time | Space | When to Use |
|---|---|---|---|
| Graph + BFS Traversal | O(n²) | O(n²) | General solution. Easy to visualize chain reactions level by level. |
| Graph + DFS Traversal | O(n²) | O(n²) | Useful when recursion is preferred for exploring full detonation paths. |
Frequently asked questions
Is Detonate the Maximum Bombs easy or hard?
Detonate the Maximum Bombs is classified as a Medium problem. The challenge comes from recognizing that the chain reactions form a directed graph and then applying BFS or DFS correctly. Once the graph modeling step is clear, the implementation becomes straightforward.
How to solve Detonate the Maximum Bombs in O(n)?
An O(n) solution is not feasible because every bomb must potentially be compared with every other bomb to determine reachability. The geometric distance checks alone require O(n^2) comparisons. As a result, the optimal practical solution remains O(n^2) using graph construction and traversal.
What is the best approach for Detonate the Maximum Bombs?
The best approach models the bombs as a directed graph and runs BFS or DFS from every bomb. Create an edge from bomb i to bomb j if j lies within i's blast radius using the squared distance formula. After building the adjacency list in O(n^2), perform a traversal from each node to count how many bombs are triggered in the chain reaction.
What data structure is used in Detonate the Maximum Bombs?
The core data structure is a graph represented using an adjacency list. Each node represents a bomb, and directed edges represent detonation reach. A queue is used for BFS or a recursion stack for DFS, along with a visited set to track triggered bombs.
What is the time complexity of Detonate the Maximum Bombs?
The overall time complexity is O(n^2). You must compare every pair of bombs to determine if one can detonate the other, which costs O(n^2). Each BFS or DFS traversal processes at most n nodes and edges, keeping the total complexity within the same bound.
Detonate the Maximum Bombs Python or Java solution approach
Both Python and Java implementations typically build an adjacency list by checking squared distances between bomb coordinates. After constructing the graph, run BFS or DFS starting from every bomb and count how many bombs are reachable in the chain reaction. Track the maximum count across all starting points.
Is Detonate the Maximum Bombs asked at Google, Amazon, or Meta?
Graph traversal and reachability problems like this commonly appear in interviews at companies such as Amazon, Google, and Meta. The problem tests graph modeling, BFS/DFS traversal, and handling geometric distance calculations within arrays.
