给一个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
个岛.【借鉴网上代码整理得】
/**
* @param grid a boolean 2D matrix
* @return an integer
*/
public int numIslands(boolean[][] grid) {
// Write your code here
//不要忘记判断数组是否为空
int row = grid.length;
//因为直接给数组赋值{},并不是null所以不能用grid==null来判断是否为空
if (row == 0 ){
return 0;
}
//当为空数组时 col赋值会报错 数组越界
int col = grid[0].length;
int count = 0;
/*或者设置一个数组 标记该位置是否判断过 节省时间
boolean[][] visited = new boolean[row][col];
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
visited[i][j] = false;
}
}*/
//采用递归 深度搜索 搜索之后的位置重置为0
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
if (grid[i][j]){
count += 1;
dfs(grid, i, j);
}
}
}
return count;
}
public void dfs(boolean[][] grid, int x, int y){
if (x < 0 || y < 0 || x >= grid.length || y >= grid[0].length || !grid[x][y]){
return ;
}
// if (visited[x][y]){
// return ;
// }
grid[x][y] = false;//访问过得位置置为0 节省时间
dfs(grid, x - 1, y);
dfs(grid, x + 1, y);
dfs(grid, x, y - 1);
dfs(grid, x, y + 1);
}
}