934.最短的桥

【LetMeFly】934.最短的桥

力扣题目链接:https://leetcode.cn/problems/shortest-bridge/

在给定的二维二进制数组 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] == 0A[i][j] == 1

方法一:广搜

在熟练掌握了图的搜索后,这道题也不难,两次搜索就可以了。

第一次搜索的时候,我们从任意一个“1”开始,当四联通(上下左右)还是1时,继续搜索,直到把一个“岛”搜完。

这样,我们就得到了一个完整的“岛”

第二次搜索的时候,我们从第一次得到的“岛”开始,一圈一圈地往外拓展。每走一步,答案加一。直到遇到新的“岛”为止

  • 时间复杂度$O(n^2)$,一共进行了两次搜索
  • 空间复杂度$O(n^2)$,空间复杂度主要来自队列

AC代码

C++

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
typedef pair<int, int> pii;
const static int directions[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
class Solution {
private:
// vector<vector<int>> distance;
int n;

queue<pii> getIslandBy1Node(int x, int y, vector<vector<int>>& grid) {
grid[x][y] = -1;
queue<pii> q, ans;
q.push({x, y});
ans.push({x, y});
while (q.size()) {
pii thisNode = q.front();
q.pop();
for (int d = 0; d < 4; d++) {
int tx = thisNode.first + directions[d][0];
int ty = thisNode.second + directions[d][1];
if (tx >= 0 && tx < n && ty >= 0 && ty < n) {
if (grid[tx][ty] == 1) {
grid[tx][ty] = -1;
q.push({tx, ty});
ans.push({tx, ty});
}
}
}
}
return ans;
}
public:
int shortestBridge(vector<vector<int>>& grid) {
n = grid.size();
// distance = vector<vector<int>>(n, vector<int>(n));
queue<pii> q;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j]) {
q = getIslandBy1Node(i, j, grid);
goto loop;
}
}
}
loop:;
int ans = 0;
while (true) {
for (int i = q.size(); i > 0; i--) {
pii thisNode = q.front();
q.pop();
for (int d = 0; d < 4; d++) {
int tx = thisNode.first + directions[d][0];
int ty = thisNode.second + directions[d][1];
if (tx >= 0 && tx < n && ty >= 0 && ty < n) {
if (grid[tx][ty] == 1) {
return ans;
}
if (grid[tx][ty] == 0) {
grid[tx][ty] = -1;
q.push({tx, ty});
}
}
}
}
ans++;
}
// return -1; // FakeReturn
}
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127509391


934.最短的桥
https://blog.letmefly.xyz/2022/10/25/LeetCode 0934.最短的桥/
作者
Tisfy
发布于
2022年10月25日
许可协议