方法1:dfs(递归或者用栈)
class Solution {
//DFS
public int numIslands(char[][] grid) {
if(grid==null||grid.length==0||grid[0].length==0){
return 0;
}
int m=grid.length;//行数
int n=grid[0].length;//列数
int res=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(grid[i][j]=='1'){
res++;
bfs(i,j,m,n,grid);
}
}
}
return res;
}
//深搜(感染函数)
public void dfs(int row,int col,int m,int n,char[][] grid){
if(row<0||row>=m||col<0||col>=n||grid[row][col]!='1'){
return ;
}
//必须四个方向,不要想着能省
grid[row][col]='2';
bfs(row,col+1,m,n,grid);
bfs(row+1,col,m,n,grid);
bfs(row,col-1,m,n,grid);
bfs(row-1,col,m,n,grid);
}
}
方法2:bfs广搜(用队列),当然非递归,参考图广度优先遍历,就是把上下左右都找一遍,然后继续对需要找的进行相同操作,我感觉其实和深搜差不多,只不过用的队列,所以对节点的访问顺序不同而已
class Solution {
//DFS
public int numIslands(char[][] grid) {
if(grid==null||grid.length==0||grid[0].length==0){
return 0;
}
int m=grid.length;//行数
int n=grid[0].length;//列数
int res=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(grid[i][j]=='1'){
res++;
bfs(i,j,m,n,grid);
}
}
}
return res;
}
//广搜(感染函数)
public void bfs(int r,int c,int m,int n,char[][] grid){
grid[r][c]='0';
int index=r*n+c;
Queue<Integer> qu=new LinkedList();
qu.add(index);
while(!qu.isEmpty()){
int temp=qu.poll();
int row=temp/n;
int col=temp%n;
if((col+1)<n&&grid[row][col+1]!='0'){//向右找
qu.add(temp+1);
grid[row][col+1]='0';
}
if((row+1)<m&&grid[row+1][col]!='0'){//down
qu.add((row+1)*n+col);
grid[row+1][col]='0';
}
if((row-1)>=0&&grid[row-1][col]!='0'){//up
qu.add((row-1)*n+col);
grid[row-1][col]='0';
}
if((col-1)>=0&&grid[row][col-1]!='0'){//left
qu.add(row*n+col-1);
grid[row][col-1]='0';
}
}
}
}
并查集没写。。