Description
Given a 2d grid map of '1'
s (land) and '0'
s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
Input:
11110
11010
11000
00000
Output: 1
Example 2:
Input:
11000
11000
00100
00011
Output: 3
Solution
这个是个典型的用dfs or bfs
解决connected components问题。详细的介绍可以参考Algs4-Undirected Graph
- 当相邻节点为1时,看作是两个节点是相连接
- 当相邻节点为0时,看作是两个节点不相链接
- 记录components的个数
count
和是否已经访问过该节点marked[][]
class Solution {
boolean[][] marked;
public int numIslands(char[][] grid) {
int rows = grid.length;
if (rows == 0) return 0;
int cols = grid[0].length;
marked = new boolean[rows][cols];
int count = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (grid[i][j] == '1' && !marked[i][j]) {
dfs(i, j, grid);
count++;
}
}
}
return count;
}
private void dfs(int i, int j, char[][] grid) {
int rows = grid.length;
int cols = grid[0].length;
marked[i][j] = true;
int[][] adj = {
{i, j-1}, {i, j+1}, {i-1, j}, {i+1, j}
};
for (int k = 0; k < adj.length; k++) {
if (adj[k][0] < 0 || adj[k][0] >= rows) continue;
if (adj[k][1] < 0 || adj[k][1] >= cols) continue;
if (marked[adj[k][0]][adj[k][1]]) continue;
if (grid[adj[k][0]][adj[k][1]] == '0') continue;
else {
dfs(adj[k][0], adj[k][1], grid);
}
}
}
}