L200 岛屿数量
使用dfs和bfs的目的,找一个值为‘1’的元素后,寻找其所有的邻居,并将其值置为0,然后计数。
核心:寻找邻居,然后进行相应操作(在这里是将值置为0)
不同的是,深度优先使用递归
广度优先使用栈
dfs
class Solution {
public int numIslands(char[][] grid) {
//初始化岛屿的数量
int count = 0;
//遍历二维数组
for(int i=0;i<grid.length;i++){
for(int j = 0;j<grid[0].length;j++){
//遇到元素为1的值就调用dfs,数量+1
if(grid[i][j] == '1'){
dfs(grid,i,j);
count++;
}
}
}
return count;
}
//dfs搜索
//i,j 越界,或者不是岛屿就直接返回,否则先把值赋值为0,然后递归,
private void dfs(char[][] grid,int i,int j){
if(i<0 || j<0 || i>=grid.length || j >= grid[0].length || 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);
}
}
bfs
class Solution {
public int numIslands(char[][] grid) {
int count = 0;
for(int i = 0;i<grid.length;i++){
for(int j =0;j<grid[0].length;j++){
if(grid[i][j] == '1'){
bfs(grid,i,j);
count++;
}
}
}
return count;
}
//bfs广度优先
//定义一个栈,将为1的元素放入栈中,将值为1的元素置为0 ,并将1元素的上下左右邻居放入栈中,
private void bfs(char[][] grid,int i,int j){
//定义一个栈,
Queue<int[]> stack = new LinkedList<>();
//将元素加入栈
stack.add(new int[]{i,j});
//只要当前栈不为空,
while(!stack.isEmpty()){
int[] cur = stack.remove();
i = cur[0];
j = cur[1];
if(i>=0 && i<grid.length && j>=0 && j<grid[0].length &&grid[i][j] =='1' ){
grid[i][j] = '0';
stack.add(new int[]{i+1,j});
stack.add(new int[]{i-1,j});
stack.add(new int[]{i,j+1});
stack.add(new int[]{i,j-1});
}
}
}