题目地址:
https://leetcode.com/problems/number-of-enclaves/
给定一个 m × n m\times n m×n的矩阵,问有多少 1 1 1或者 1 1 1的连通块是被 0 0 0完全包围的。
用floodfill即可,先把边界上的 1 1 1全floodfill成一个别的数字,接下来统计 1 1 1的个数即可。具体floodfill可以用DFS实现。代码如下:
public class Solution {
public int numEnclaves(int[][] A) {
if (A == null || A.length == 0) {
return 0;
}
int[][] dirs = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
// floodfill四个边界上的1,使之变为2
for (int i = 0; i < A.length; i++) {
if (A[i][0] == 1) {
dfs(A, i, 0, dirs, 2);
}
if (A[i][A[0].length - 1] == 1) {
dfs(A, i, A[0].length - 1, dirs, 2);
}
}
for (int i = 0; i < A[0].length; i++) {
if (A[0][i] == 1) {
dfs(A, 0, i, dirs, 2);
}
if (A[A.length - 1][i] == 1) {
dfs(A, A.length - 1, i, dirs, 2);
}
}
// 接下来统计“内陆”的1的个数
int ans = 0;
for (int i = 0; i < A.length; i++) {
for (int j = 0; j < A[0].length; j++) {
if (A[i][j] == 1) {
ans += 1;
}
}
}
return ans;
}
// 功能是从A[x][y]开始把1都fill成fill这个值
private void dfs(int[][] A, int x, int y, int[][] dirs, int fill) {
A[x][y] = fill;
int area = 1;
for (int i = 0; i < 4; i++) {
int newX = x + dirs[i][0];
int newY = y + dirs[i][1];
if (0 <= newX && newX < A.length && 0 <= newY && newY < A[0].length && A[newX][newY] == 1) {
dfs(A, newX, newY, dirs, fill);
}
}
}
}
时空复杂度 O ( m n ) O(mn) O(mn)。