1020、飞地的数量
leetcode题库1020飞地的数量
题目如下
给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。
一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。
返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。

思路
首先我们知道,靠近表格边界的陆地一定不是飞地,所以我们找到所有靠近边界的陆地,开始深度优先遍历,将遍历到的陆地都置为0,最后遍历整个单元格,查找陆地的数量,即为飞地的数量。
代码如下
package LeetCode;
//1020.飞地的数量
public class NumEnclaves {
public static void main(String[] args) {
NumEnclaves Num=new NumEnclaves();
int[][] grid = {{0, 1, 0, 0},
{1, 0, 1, 0},
{0, 1, 0, 0},
{1, 0, 0, 1}};
int ans = Num.numEnclaves(grid);
System.out.println(ans);
}
private int m;
private int n;
private int[][] dirs = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
private int ans=0;
public int numEnclaves(int[][] grid) {
m= grid.length;
n = grid[0].length;
//遍历边界的单元格
for (int i = 0; i < m; i++) {
DFS(grid, i, 0);
DFS(grid, i, n - 1);
}
for (int j = 1; j < n-1; j++) {
DFS(grid, 0, j);
DFS(grid, m - 1, j);
}
//遍历查找修改完的所有的单元格,剩下的单元格是1则飞地加1
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) {
ans++;
}
}
}
return ans;
}
//深度优先遍历
private void DFS(int[][] grid, int i, int j) {
if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j]==0) {
return;
}
//找到陆地,置为0
grid[i][j]=0;
//查找陆地是否有紧挨的陆地
for (int[] Dirs : dirs) {
DFS(grid,i+Dirs[0],j+Dirs[1]);
}
}
}

浙公网安备 33010602011771号