今天看到今日头条的面试题中有一道求海岛个数的问题,想起之前学习算法时学习到并查集结构遇到类似的题目,但是一下想不起来怎么解决了。。。所以看了网友的分析马上就有了思路,不到两分钟就撸出来了。
题目描述:
给定一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
这题的思路是先遍历数组中每个元素,当遇到1时将海岛数量++,并且遍历1周围的位置,如果也有1就将1变为2。这样在遍历数组中每个元素时就可以知道哪些是岛屿了。
上代码:
class Solution {
public int numIslands(char[][] grid) {
if(grid == null || grid[0] == null)
return 0;
int res = 0;
for( int i=0 ; i < grid.length ; i++)
for( int q = 0 ;q < grid[0].length ;q++){
if(grid[i][q] == '1'){
res++;
infect(grid, i ,q);
}
}
return res;
}
public static void infect(char [][] grid , int i ,int q){
if( i <0 || i >= grid.length || q < 0 ||q >= grid[0].length || grid[i][q] != '1')
return;
grid[i][q] = '2';
infect(grid,i+1,q);
infect(grid,i-1,q);
infect(grid,i,q+1);
infect(grid,i,q-1);
}
}
这几天都在忙着课程作业和面试,都没有时间做算法题了。。今后还是要多刷刷题