分析:考察的数据结构是二位数组,考察的算法是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; } }