给一个01矩阵,求不同的岛屿的个数。
0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
样例
在矩阵:
[
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]
]
中有 3 个岛.
//广度优先搜索,时间复杂度O(m*n),空间复杂度复杂度O(m*n),原始数据保持原样
public class Solution {
/**
* @param grid a boolean 2D matrix
* @return an integer
*/
private int[][] stepArr = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
private int m, n;
private int[][] visit;
public int numIslands(boolean[][] grid) {
if(null == grid || grid.length == 0 || grid[0].length == 0) return 0;
m = grid.length;
n = grid[0].length;
visit = new int[m][n];
int count = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(grid[i][j] == true && visit[i][j] == 0) {
bfs(grid, i, j);
count++;
}
}
}
return count;
}
public void bfs(boolean[][] grid, int i, int j) {
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(i * n + j);
visit[i][j] = 1;
while(null != queue.peek()) {
int num = queue.poll();
i = num / n;
j = num % n;
for(int k = 0; k < 4; k++) {
int x =i + stepArr[k][0];
int y =j + stepArr[k][1];
if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == true && visit[x][y] == 0) {
queue.add(x * n + y);
visit[x][y] = 1;
}
}
}
}
}
//深度优先搜索,时间复杂度O(m*n),空间复杂度O(1),更改了原始数据
public class Solution {
private int[][] stepArr = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
private int m, n;
public int numIslands(boolean[][] grid) {
if(null == grid || grid.length == 0 || grid[0].length == 0) return 0;
m = grid.length;
n = grid[0].length;
int count = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(grid[i][j] == true) {
dfs(grid, i, j);
count++;
}
}
}
return count;
}
public void dfs(boolean[][] grid, int i, int j) {
grid[i][j] = false;
for(int k = 0; k < 4; k++) {
int x = i + stepArr[k][0];
int y = j + stepArr[k][1];
if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == true) {
dfs(grid, x, y);
}
}
}
}