1.题目
题目:给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。示例 1:输入:
11110
11010
11000
00000
输出: 1
示例 2:输入:
11000
11000
00100
00011
输出: 3
2.解题思路
- 遍历所有的节点,利用DFS的方式将其周围的1全部赋值为0, 如果是0直接跳过(如果不跳过会把整个图都赋值为0一遍)
3.代码实现
3.1 递归实现
class Solution {
public int numIslands(char[][] grid) {
// int row = grid.length;
// int col = grid[0].length; IndexOutOfBoundException
int res = 0;
for(int i = 0; i < grid.length; i++) {
for(int j = 0; j < grid[i].length; j++) {
if (grid[i][j] == '1'){
res++;
dfs(grid, i , j);
}
}
}
return res;
}
public void dfs(char[][] grid, int i, int j) {
if (i < 0 || j < 0 || i >= grid.length || j >= grid[i].length)
return;
if (grid[i][j] == '0')
return;
grid[i][j] = '0';
dfs(grid, i + 1 , j);
dfs(grid, i , j + 1);
dfs(grid, i - 1 , j);
dfs(grid, i , j - 1);
}
}
3.2非递归实现
class Solution {
public int numIslands(char[][] grid) {
// int row = grid.length;
// int col = grid[0].length; IndexOutOfBoundException
int res = 0;
for(int i = 0; i < grid.length; i++) {
for(int j = 0; j < grid[i].length; j++) {
if (grid[i][j] == '1'){
res++;
dfs(grid, i , j);
}
}
}
return res;
}
// recursion
// public void dfs(char[][] grid, int i, int j) {
// if (i < 0 || j < 0 || i >= grid.length || j >= grid[i].length)
// return;
// if (grid[i][j] == '0')
// return;
// grid[i][j] = '0';
// dfs(grid, i + 1 , j);
// dfs(grid, i , j + 1);
// dfs(grid, i - 1 , j);
// dfs(grid, i , j - 1);
// }
//non-recursion
class IndexNode {
int i;
int j;
public IndexNode(int i, int j) {
this.i = i;
this.j = j;
}
}
public void dfs(char[][] grid, int i, int j) {
Queue<IndexNode> queue = new LinkedList<>();
queue.add(new IndexNode(i, j));
IndexNode temp = null;
while(!queue.isEmpty()) {
temp = queue.poll();
if (temp.i < 0 || temp.j < 0 || temp.i >= grid.length || temp.j >= grid[i].length)
continue;
if (grid[temp.i][temp.j] == '0')
continue;
grid[temp.i][temp.j] = '0';
queue.add(new IndexNode(temp.i + 1 , temp.j));
queue.add(new IndexNode(temp.i , temp.j + 1));
queue.add(new IndexNode(temp.i - 1 , temp.j));
queue.add(new IndexNode(i , temp.j - 1));
}
}
}