最近在做力扣学习学习数据结构与算法,评论区看到解决方案在此记录下。
BFS
import java.util.LinkedList;
import java.util.Queue;
/**
* Created by leo on 2022/1/17.
* m == grid.length
* n == grid[i].length
* 1 <= m, n <= 300
* grid[i][j] 的值为 '0' 或 '1'
*/
public class BFSTest {
public int numIsLands(char[][] grid){
//边界值判断
if(grid == null || grid.length == 0){
return 0;
}
//统计岛屿的个数
int count =0;
for(int i=0;i< grid.length;i++){
for(int j=0;j<grid[0].length;j++){
//只有当前格子是1,岛屿的数量+1
if(grid[i][j] == '1'){
//如果当前格子是1,岛屿的数量加1
count++;
//然后通过bfs把当前格子的上下左右4个位置为1的都要置为0,
// 因为他们是连着一起的算一个岛屿
bfs(grid,i,j);
}
}
}
return count;
}
private void bfs(char[][] grid,int x,int y){
//把当前格子置为0
grid[x][y] = '0';
int n =grid.length;
int m = grid[0].length;
//使用队列存储的是格子坐标转化的值
Queue<Integer> queue = new LinkedList<>();//动态数组
//我们知道平面坐标是两位数字,但队列中存储的是一位数字,
//所以这里是把两位数字转化为一位数字
int code = x*m +y;
queue.add(code); //坐标转化的值存放到队列中
while(!queue.isEmpty()){
//出队并返回head
code = queue.poll();
//在反转成坐标值(i,j)
int i = code / m;
int j = code % m;
if(i>0 && grid[i-1][j] =='1'){//上
//如果上边格子为1,把它置为0,然后加入到队列中
//下面同理
grid[i-1][j] = '0';
queue.add((i-1)*m+j);
}
if (i < n - 1 && grid[i + 1][j] == '1') {//下
grid[i + 1][j] = '0';
queue.add((i + 1) * m + j);
}
if (j > 0 && grid[i][j - 1] == '1') { //左
grid[i][j - 1] = '0';
queue.add(i * m + j - 1);
}
if (j < m - 1 && grid[i][j + 1] == '1') {//右
grid[i][j + 1] = '0';
queue.add(i * m + j + 1);
}
}
}
}
DFS
/**
* Created by leo on 2022/1/17.
* m == grid.length
* n == grid[i].length
* 1 <= m, n <= 300
* grid[i][j] 的值为 '0' 或 '1'
*/
public class DFSTest {
//边界条件判断
public int numIsLands(char[][] grid){
//边界值判断
if(grid == null || grid.length == 0){
return 0;
}
int count =0;//统计岛屿数量
//遍历格子
for(int i =0; i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
//只有当前格子为1 才开始计算
if(grid[i][j] == '1'){
//如果当前格子为1,岛屿数量+1
count++;
//dfs当前格子的上下左右
//4个位置为1 的都要置为0,它们连在一起算一个岛屿
dfs(grid,i,j);
}
}
}
return count;
}
//这个方法会把当前格子以及他邻近的为1的格子都会置为0
public void dfs(char[][] grid,int i,int j){
//边界条件判断。不能越界
if(i<0 || i>=grid.length||j<0|| j>= grid[0].length|| grid[i][j] == '0'){
return;
}
//把当前格子置为0,然后再从他的上下左右4个方向继续遍历
grid[i][j] = '0';
dfs(grid, i - 1, j);//上
dfs(grid, i + 1, j);//下
dfs(grid, i, j + 1);//左
dfs(grid, i, j - 1);//右
}
}
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/queue-stack/kbcqv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。