题目描述
在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)
现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。
返回必须翻转的 0 的最小数目。(可以保证答案至少是 1 。)
-
示例 1:
输入:A = [[0,1],[1,0]]
输出:1 -
示例 2:
输入:A = [[0,1,0],[0,0,0],[0,0,1]]
输出:2 -
示例 3:
输入:A = [[1,1,1,1,1],[1,0,0,0,1],[1,0,1,0,1],[1,0,0,0,1],[1,1,1,1,1]]
输出:1
提示:
2 <= A.length == A[0].length <= 100
A[i][j] == 0 或 A[i][j] == 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-bridge
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
DFS找出两个大陆并做标记1和2,对1号大陆的海域按BFS一层层地找寻2号大陆的边界,层数就和桥的长度成正相关。
代码详解
class Solution {
public int shortestBridge(int[][] A) {
int Ar = A.length;
int Ac = A[0].length;
int[][] map = buildMap(A); // 对原地图进行“上色”-->标记为1号大陆和2号大陆
Set<Integer> set = new HashSet<>(); // 存放2号大陆/目标大陆的各板块“位置”
Queue<Node> queue = new LinkedList<>(); // 利用队列进行BFS
// 1号大陆放入队列queue,2号大陆放入集合set
for(int i = 0; i < Ar; ++i) {
for(int j = 0; j < Ac; ++j) {
if(map[i][j] == 1) {
queue.offer(new Node(i, j, 0));
} else if(map[i][j] ==