力扣200
class Solution
{
public int numIslands(char[][] nums)
{
//m是二维数组的行数
int m=nums.length;
//n是二维数组的列数
int n=nums[0].length;
int result=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(nums[i][j]=='1')
{
dfs(nums,i,j);
//从dfs跳出来一次,说明找出来一座岛屿,于是result++
result++;
}
}
}
return result;
}
public void dfs(char[][] nums,int i,int j)
{
//越界或者是碰到为零的就结束这次搜索
if(i<0||j<0||i>=nums.length||j>=nums[0].length||nums[i][j]=='0') return;
// (i, j) 向此点的上下左右 (i+1,j),(i-1,j),(i,j+1),(i,j-1)
//这个节点遍历过就将其置为0,这样就不会重复搜索这个节点了
nums[i][j]='0';
dfs(nums,i+1,j);
dfs(nums,i-1,j);
dfs(nums,i,j+1);
dfs(nums,i,j-1);
}
}
力扣695 岛屿最大面积
和上面求岛屿面积相比,其实就是将无返回值的dfs(void dfs)改成了有返回值的dfs(int dfs)
class Solution
{
public int maxAreaOfIsland(int[][] grid)
{
if(grid == null || grid.length == 0) return 0;
int m = grid.length, n = grid[0].length;
int maxArea = 0; //记录最大岛屿面积,最终返回
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
if(grid[i][j] == 1)
{
//以陆地为中心向四周找
int curArea = dfs(grid, i, j);
//更新最大岛屿面积
maxArea = Math.max(maxArea, curArea);
}
}
}
return maxArea;
}
/**dfs向四周找陆地 */
private int dfs(int[][] grid, int i, int j)
{
//递归终止:越界 或者 走到了水域
if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == 0) return 0;
grid[i][j] = 0; //标记为0,防止重复访问
//上下左右搜索
int up = dfs(grid, i - 1, j);
int down = dfs(grid, i + 1, j);
int left = dfs(grid, i, j - 1);
int right = dfs(grid, i, j + 1);
return up + down + left + right + 1;
}
}