一、题目
给你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只包含 0 (表示水域)和 1 (表示陆地)。一个 岛屿 是由 四个方向 (水平或者竖直)上相邻的 1 组成的区域。任何矩阵以外的区域都视为水域。
如果 grid2 的一个岛屿,被 grid1 的一个岛屿 完全 包含,也就是说 grid2 中该岛屿的每一个格子都被 grid1 中同一个岛屿完全包含,那么我们称 grid2 中的这个岛屿为 子岛屿 。
请你返回 grid2 中 子岛屿 的 数目 。
示例 1:
输入:grid1 = [[1,1,1,0,0],[0,1,1,1,1],[0,0,0,0,0],[1,0,0,0,0],[1,1,0,1,1]], grid2 = [[1,1,1,0,0],[0,0,1,1,1],[0,1,0,0,0],[1,0,1,1,0],[0,1,0,1,0]]
输出:3
示例 2:
输入:grid1 = [[1,0,1,0,1],[1,1,1,1,1],[0,0,0,0,0],[1,1,1,1,1],[1,0,1,0,1]], grid2 = [[0,0,0,0,0],[1,1,1,1,1],[0,1,0,1,0],[0,1,0,1,0],[1,0,0,0,1]]
输出:2
提示:
- m == grid1.length == grid2.length
- n == grid1[i].length == grid2[i].length
- 1 <= m, n <= 500
- grid1[i][j] 和 grid2[i][j] 都要么是 0 要么是 1 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-sub-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 深度优先搜索
(1)思路
结合深度优先搜索方法,检查 grid2 中的所有岛屿,判断是否为 grid1 的子岛屿。
(2)代码
class Solution {
int[][] grid1, grid2;
boolean[][] checked;
int m, n;
public int countSubIslands(int[][] grid1, int[][] grid2) {
//初始化
this.m = grid1.length;
this.n = grid1[0].length;
this.grid1 = grid1;
this.grid2 = grid2;
this.checked = new boolean[m][n];//checked[i][j]表示坐标[i,j]处是否已统计过,也可通过统计后直接将grid2中对应格子置0作为标记
for (int i = 0; i < m; i++)
Arrays.fill(checked[i], false);
//遍历grid2中的岛屿
int ans = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
if (grid2[i][j] == 1 && checked[i][j] == false && checkIsland(i, j) == true)
ans++;
}
return ans;
}
//DFS检查grid2中该岛屿的所有格子,并确定是否为子岛屿
public boolean checkIsland(int i, int j) {
if (grid2[i][j] == 0 || checked[i][j] == true)//水面或已检查过的格子无需遍历
return true;
checked[i][j] = true;//检查该格子
boolean subIsland = (grid1[i][j] == 1) ? true : false;
if (i > 0)//检查左侧格子
subIsland &= checkIsland(i - 1, j);
if (i < m - 1)//检查右侧格子
subIsland &= checkIsland(i + 1, j);
if (j > 0)//检查上侧格子
subIsland &= checkIsland(i, j - 1);
if (j < n - 1)//检查下侧格子
subIsland &= checkIsland(i, j + 1);
return subIsland;
}
}
(3)结果
执行用时 :31 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :87.3 MB,在所有 Java 提交中击败了 100.00% 的用户。
(目前提交用户量不足,暂无排名)
三、其他
暂无。