leetcode算法:岛屿数量
题目描述:
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
输入:grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
输出:1
思路:
很明显,一个岛屿由多个1连接而成,1不能重复计算,考虑简单的深度搜索。
java代码
public int numIslands(char[][] grid) {
int res = 0;
//flag[i][j] 代表是否已经计算过i j位置
boolean[][] flag = new boolean[grid.length][grid[0].length];
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[i].length;j++){
if(!flag[i][j]){
//如果没有计算过
if(grid[i][j]=='1'){
//有1岛屿数量就加1 然后从当前位置出发进行深度搜索
//将一个岛屿所有的1 的flag全部设置为true 代表已经计算过该岛屿
res++;
dfs(grid,i,j,flag);
}
}
}
}
return res;
}
public void dfs(char[][] grid,int i,int j,boolean[][] flag){
if(i>=grid.length||i<0||j<0||j>=grid[i].length){
return;
}
if(flag[i][j]){
return;
}
flag[i][j]=true;
if(grid[i][j]=='0'){
return;
}
dfs(grid,i-1,j,flag);
dfs(grid,i,j-1,flag);
dfs(grid,i,j+1,flag);
dfs(grid,i+1,j,flag);
}