题目
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
思路
可以使用使用深度优先遍历和广度优先遍历。
TIPS:
网格类的题目基本都可以考虑使用广度优先遍历进行解决。
代码
以广度优先遍历为例进行代码的演示。
class Solution {
public int numIslands(char[][] grid) {
if(grid==null||grid.length==0){return 0;}
int[][] dp ={{0,1},{1,0},{0,-1},{-1,0}};
int m = grid.length;
int n = grid[0].length;
int numIsland = 0;
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(grid[i][j]=='1'){
numIsland++;
grid[i][j]=0;
Queue<Integer> queue = new LinkedList<>();
queue.add(i*n+j);
while(!queue.isEmpty()){
int num = queue.poll();
int m1 = num/n;
int n1 = num%n;
for(int z=0; z<4; z++){
if(m1+dp[z][0]>=0&&m1+dp[z][0]<m&&n1+dp[z][1]>=0&&n1+dp[z][1]<n&&grid[m1+dp[z][0]][n1+dp[z][1]]=='1'){
queue.add((m1+dp[z][0])*n+n1+dp[z][1]);
grid[m1+dp[z][0]][n1+dp[z][1]]=0;
}
}
}
}
}
}
return numIsland;
}
}
复杂度分析
- 时间复杂度:O(mn)
- 空间复杂度:O(mn),最坏情况下整个网格均为陆地,需要遍历所有网格。