🚀 算法题 🚀 |
🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯
🚀 算法题 🚀 |
🚩 题目链接
⛲ 题目描述
给你一个炸弹列表。一个炸弹的 爆炸范围 定义为以炸弹为圆心的一个圆。
炸弹用一个下标从 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
🌟 求解思路&实现代码&运行结果
⚡ BFS
🥦 求解思路
- 炸弹的爆炸具有传导性,该题目可以通过DFS或者BFS来求解,具体的思路就是先遍历每一个炸弹,从该位置的炸弹开始,枚举遍历其它位置可能被引爆的炸弹。
- 什么情况是被引爆的呢?其实就是判断俩个圆是否相交,通过公式判断即可。Math.pow(nx - x, 2)) + (long) (Math.pow(ny - y, 2)) <= (long) (r * r)。
- 需要注意的是,数据范围可能超出范围,会越界,使用long类型接收。
- 有了基本的思路,接下来我们就来通过代码来实现一下的解法。
🥦 实现代码
class Solution {
public int maximumDetonation(int[][] bombs) {
int m = bombs.length;
Deque<int[]> queue = new LinkedList<>();
int max = 0;
for (int i = 0; i < m; i++) {
int cnt = 1;
boolean[] visited = new boolean[m];
visited[i] = true;
queue.addLast(bombs[i]);
while (!queue.isEmpty()) {
int[] bom = queue.pollFirst();
long x = bom[0], y = bom[1], r = bom[2];
for (int j = 0; j < m; j++) {
if (visited[j])
continue;
int[] next = bombs[j];
long nx = next[0], ny = next[1], nr = next[2];
if ((long) (Math.pow(nx - x, 2)) + (long) (Math.pow(ny - y, 2)) <= (long) (r * r)) {
queue.addLast(next);
visited[j] = true;
cnt++;
}
}
}
max = Math.max(max, cnt);
}
return max;
}
}
🥦 运行结果
💬 共勉
最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |