1 题目
2 解析
1:深度有限搜索(dfs)
import java.util.*;
public class Solution {
/**
* 判断岛屿数量
* @param grid char字符型二维数组
* @return int整型
*/
public int solve (char[][] grid) {
// write code here
int m = grid.length;
if(m == 0){
return 0;
}
int n = grid[0].length;
int ret = 0;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(grid[i][j] == '1'){
// 每找到一个1就把自己和周围连着的1全部置为0然后将结果加1
dfs(grid, i, j);
ret++;
}
}
}
return ret;
}
// 深度优先算法,以周围的某个点为基础遍历完整条路径才算结束
public void dfs(char[][] grid, int i, int j){
int m = grid.length;
int n = grid[0].length;
grid[i][j] = '0';
if(i - 1 >= 0 && grid[i-1][j] == '1'){
dfs(grid, i-1, j);
}
if(i + 1 < m && grid[i+1][j] == '1'){
dfs(grid, i+1, j);
}
if(j - 1 >= 0 && grid[i][j-1] == '1'){
dfs(grid, i, j-1);
}
if(j + 1 < n && grid[i][j+1] == '1'){
dfs(grid, i, j+1);
}
}
}
2:广度优先搜索(bfs)
import java.util.*;
public class Solution {
public int solve (char[][] grid) {
int n = grid.length;
//空矩阵的情况
if (n == 0)
return 0;
int m = grid[0].length;
//记录岛屿数
int count = 0;
//遍历矩阵
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
//遇到1要将这个1及与其相邻的1都置为0
//同时将该点坐标放入队列中然后对该点上下左右进行判断
if(grid[i][j] == '1'){
//岛屿数增加
count++;
grid[i][j] = '0';
//记录后续bfs的坐标
Queue<Integer> q1 = new LinkedList<Integer>();
Queue<Integer> q2 = new LinkedList<Integer>();
q1.offer(i);
q2.offer(j);
//bfs
while(!q1.isEmpty()){
int row = q1.poll();
int col = q2.poll();
//四个方向依次检查:不越界且为1
if(row - 1 >= 0 && grid[row - 1][col] == '1'){
q1.offer(row - 1);
q2.offer(col);
grid[row - 1][col] = '0';
}
if(row + 1 < n && grid[row + 1][col] == '1'){
q1.offer(row + 1);
q2.offer(col);
grid[row + 1][col] = '0';
}
if(col - 1 >= 0 && grid[row][col - 1] == '1'){
q1.offer(row);
q2.offer(col - 1);
grid[row][col - 1] = '0';
}
if(col + 1 < m && grid[row][col + 1] == '1'){
q1.offer(row);
q2.offer(col + 1);
grid[row][col + 1] = '0';
}
}
}
}
}
return count;
}
}