题目

遍历一遍数组,当找到数组元素是1的话,就将这个封闭空间的数全部变成2,岛屿数加1,直到遍历完数组。

var numIslands = function(grid) {
  let num = 0;
  for(let i=0;i<grid.length;i++){
    for(let j=0;j<grid[0].length;j++){
      if(grid[i][j]==='1'){
        modifyGridItemToTwo(grid,i,j);
        num++;
      }
    }
  }
  return num;
};

function modifyGridItemToTwo(arr,i,j){
  if(i<0||i>=arr.length)return;
  if(j<0||j>=arr[0].length)return;
  if(arr[i][j]!='1')return;
  arr[i][j] = '2';
  modifyGridItemToTwo(arr,i+1,j);
  modifyGridItemToTwo(arr,i-1,j);
  modifyGridItemToTwo(arr,i,j+1);
  modifyGridItemToTwo(arr,i,j-1);
}

还有几道十分类似的题目,我们来趁热打铁写一下。

岛屿的周长

var islandPerimeter = function(grid) {
    for(let i=0;i<grid.length;i++){
        for(let j=0;j<grid[0].length;j++){
            if(grid[i][j]===1){
                return getGridIslandPerimeter(grid,i,j);
            }
        }
    }
};

function getGridIslandPerimeter(grid,i,j){
    if(i<0||i>=grid.length||j<0||j>=grid[0].length||grid[i][j]!=1)return 0;
    grid[i][j] = 2;
    const length = judgeIsZero(grid,i-1,j) + judgeIsZero(grid,i+1,j)
                    + judgeIsZero(grid,i,j-1) + judgeIsZero(grid,i,j+1);
                    
    return length + getGridIslandPerimeter(grid,i-1,j)
            + getGridIslandPerimeter(grid,i+1,j)
            + getGridIslandPerimeter(grid,i,j+1)
            + getGridIslandPerimeter(grid,i,j-1);
}

function judgeIsZero(grid,i,j){
    if(i<0||i>=grid.length||j<0||j>=grid[0].length)return 1;
    return grid[i][j] === 0 ? 1 : 0;
}

岛屿的最大面积

var maxAreaOfIsland = function(grid) {
    let result = 0;
    for(let i=0;i<grid.length;i++){
        for(let j=0;j<grid[0].length;j++){
            if(grid[i][j]===1){
                result = Math.max(result, maxIsland(grid,i,j));
            }
        }
    }
    return result;
};

function maxIsland(grid, i,j){
    if(i<0||i>=grid.length||j<0||j>grid[0].length||grid[i][j]!==1)return 0;
    grid[i][j] = 2;
    return 1 + 
    maxIsland(grid,i+1,j) +
    maxIsland(grid,i-1,j) +
    maxIsland(grid,i,j+1) +
    maxIsland(grid,i,j-1);
}