力扣真题:200. 岛屿数量(两种实现方法)

 java代码实现:

第一种:

用了类似感染的方法,就是一个节点出发,如果此时这个节点没被感染,且是陆地,就可以进入遍历,将其邻接的陆地全部遍历一遍,标志数组sign相应位置至为1.然后一次遍历一块陆地,能遍历几次就代表有几块陆地。

class Solution {
 
    public int numIslands(char[][] grid) {
        int [][] sign = new int [grid.length][grid[0].length];
        int sum = 0;
        for(int i = 0; i< grid.length;i++){
            for(int j = 0; j<grid[i].length;j++){
                if(!(grid[i][j] == '0'||sign[i][j] == 1)){
                    sum += change(grid,sign,i,j);
                }
            }
        }
        return sum;
    }
    public int change(char[][]grid,int[][]sign,int i, int j){
        if(grid[i][j] == '0'||sign[i][j] == 1){
            sign[i][j] = 1;
            return 0;
        }else{
            sign[i][j] = 1;
            if(j+1<grid[i].length){
                change(grid,sign,i,j+1);
            }
            if(i+1<grid.length){
                change(grid,sign,i+1,j);
            }
            if(j-1>=0){
                change(grid,sign,i,j-1);
            }if(i-1>=0){
                change(grid,sign,i-1,j);
            }
            return 1;
        }
    }
}

第二种:

这种方法相较于第一种有了不错的优化,没有建立新的数组,而是再原来的数组的基础上进行改动。和上面那个思路差不多,没一次遍历会将一块陆地变为海洋将其置为’0‘,当没有陆地的就遍历完成。

class Solution {
 
     public static int numIslands(char[][] grid) {
        int sum = 0;
        for(int i = 0; i< grid.length;i++){
            for(int j = 0; j<grid[i].length;j++){
                if(!(grid[i][j] == '0')){
                     change(grid,i,j);
                    sum ++;
                }
            }
        }
        return sum;
    }
    public static void change(char[][] grid, int i, int j){
        if(grid[i][j] == '0'){
            return ;
        }else{
            grid[i][j] = '0';
            if(j+1<grid[i].length){
                change(grid,i,j+1);
            }
            if(i+1<grid.length){
                change(grid,i+1,j);
            }
            if(j-1>=0){
                change(grid,i,j-1);
            }if(i-1>=0){
                change(grid,i-1,j);
            }
            return ;
        }
    }
}

 

猜你喜欢

转载自blog.csdn.net/qq_64680177/article/details/132098652