题目链接
题目描述
二维矩阵 grid
由 0
(土地)和 1
(水)组成。岛是由最大的 4 个方向连通的 0
组成的群,封闭岛是一个 完全
由 1 包围(左、上、右、下)的岛。
请返回 封闭岛屿 的数目。
示例 1:
输入: grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]
输出: 2
解释:
灰色区域的岛屿是封闭岛屿,因为这座岛屿完全被水域包围(即被 1 区域包围)。
示例 2:
输入: grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]
输出: 1
示例 3:
输入: grid = [[1,1,1,1,1,1,1],
[1,0,0,0,0,0,1],
[1,0,1,1,1,0,1],
[1,0,1,0,1,0,1],
[1,0,1,1,1,0,1],
[1,0,0,0,0,0,1],
[1,1,1,1,1,1,1]]
输出: 2
提示:
1 <= grid.length, grid[0].length <= 100
-
解题思路
方法一:深度优先遍历
首先遍历最外围土地,连接最外围土地的岛屿一定不是封闭岛屿,遍历并记录这些土地。
然后遍历内围土地,在内围土地中,未被标记的均属于封闭岛屿。class Solution {
public int closedIsland(int[][] grid) {
int res = 0;
int row = grid.length, col = grid[0].length;
// 遍历外围,深度优先搜索,将所有非封闭岛屿全部设为 -1
for(int i = 0; i < row; ++i){
if(grid[i][0] == 0){
backstrack(grid, i, 0, 0, -1);
}
if(grid[i][col - 1] == 0){
backstrack(grid, i, col - 1, 0, -1);
}
}
for(int i = 1; i < col - 1; ++i){
if(grid[0][i] == 0){
backstrack(grid, 0, i, 0, -1);
}
if(grid[row - 1][i] == 0){
backstrack(grid, row - 1, i, 0, -1);
}
}
// 遍历内围,深度优先搜索,将所有封闭岛屿全部设为 2
for(int i = 1; i < grid.length - 1; ++i){
for(int j = 1; j < grid[0].length - 1; ++j){
if(grid[i][j] == 0){
++res;
backstrack(grid, i, j, 0, 2);
}
}
}
return res;
}
// 深度优先遍历, 将所有 val 改为 target
private void backstrack(int[][] grid, int i, int j, int val, int target){
if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] != val){
return;
}
grid[i][j] = target;
backstrack(grid, i + 1, j, val, target);
backstrack(grid, i - 1, j, val, target);
backstrack(grid, i, j + 1, val, target);
backstrack(grid, i, j - 1, val, target);
}
}
时间复杂度:O(m*n)
- 空间复杂度:O(1)