分析:考察的数据结构是二位数组,考察的算法是dfs 或者 bfs。但是bfs 要用队列来存临时数据,一般还是 dfs 用得比较多,全部交给机器。
哈哈,这两个是以前我最怕的,没想到现在处理起来这么从容,是写得最快的。
首先要理解 dfs 和 bfs 的含义,并不是刻板的一个算法模板,而是一个算法的思路,。dfs 在 树的遍历里面提到过,这里在图里面也是提到过,在不同的地方都有什么目的。很明显就是一句话,不停的尝试,不恰当的说法就是吃着碗里的还想着锅里的,直到锅里没东西了再回溯遍历其他路径。
所以在这里有一个比较出名的图遍历的着色法,但是这里恰恰是把图都着色好了,要计算有多少小岛。很明显这里要找到n个遍历起点,每一次我们都把小岛能遍历的地方都走一遍并标记,找到了n个起点就说明有 n个小岛。
public int solve (char[][] grid) {
// write code here
if(grid==null || grid.length==0){
return 0;
}
int m=grid.length;
int n=grid[0].length;
int res=0;
for(int x=0;x<m;x++){
for(int y=0;y<n;y++){
if(grid[x][y]=='1'){
dfs(grid,x,y,m,n);//找到一个起点就深挖,把与这个起点有连接的点全都玷污一遍
res+=1; //记录小岛个数
}
}
}
return res;
}
public void dfs(char [][] grid,int x,int y,int m,int n){
if(x>=0&&x<m &&y>=0&& y<n){ //在界内,要是越界就说明到头了
if(grid[x][y]=='1'){
grid[x][y]='0';//直接在原数组上操作更新方便判断,直接标记这里遍历过了,后面就是上下左右开始遍历了
dfs(grid,x+1,y,m,n);
dfs(grid,x-1,y,m,n);
dfs(grid,x,y+1,m,n);
dfs(grid,x,y-1,m,n);
}
}else{
return;
}
}
京公网安备 11010502036488号