LeetCode -- 小岛数量

1,034 阅读2分钟

Number of Islands 小岛数量

Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

给定一个二维网格地图,‘1’表示陆地,‘0’表示水域。计算小岛的数量。 岛屿被水环绕,由水平或垂直连接相邻的陆地而形成。你可以假设网格的四个边都被水包围着。

Example 1:

Input:
11110
11010
11000
00000

Output: 1

Example 2:

Input:
11000
11000
00100
00011

Output: 3

从某个1开始,它的上下左右只要是1,就连接起来,当整块区域都被0包围时,此时这个区域就是1个岛屿。 结果就是算出有多少个岛屿。

本题使用广度遍历BFS或者深度遍历DFS实现即可。

public int numIslands(char[][]grid){
    if(grid.length == 0|| grid[0].length == 0){
        return 0;
    }
    int rows = grid.length;
    int columns = grid[0].length;
    int count = 0;
    for(int i=0;i<rows;i++){
        for(int j=0;j<columns;j++){
            if(grid[i][j]=='1'){
                count++;
                bfs(grid,i,j,rows,columns);
                // dfs(grid,i,j,rows,columns);
            }
        }
    }
}

1.广度遍历BFS,将符合点的四周四个点入队,然后再出队遍历即可。

public void bfs(char[][]grid,int i,int j,int rows,int columns){
    Queue<Integer> queue = new LinkedList();
    grid[i][j]='0';
    queue.add(i*columns+j);
    while(!queue.isEmpty()){
        int node = queue.remove();
        int first = node / columns;
        int second = node % columns;
        
        if(first-1>=0 && grid[first-1][second] == '1'){
            queue.add((first-1)*columns + second);
            grid[first-1][second]='0';
        }
        if(first+1<rows && grid[first+1][second] == '1'){
            queue.add((first+1)*columns + second);
            grid[first+1][second] = '0';
        }
        
        if(second-1>=0 && grid[first][second-1] == '1'){
            queue.add(first*columns+second-1);
            grid[first][second-1]='0';
        }
        
        if(second+1<columns && grid[first][second+1] == '1'){
            queue.add(first*columns+second+1);
            grid[first][second+1]='0';
        }
    }
}

2.深度遍历DFS,是从一个点不断往下走,使用递归完成。

public void dfs(char[][]grid,int i,int j,int rows,int columns){
    if(i<0 || i>=rows || j<0 || j>=rows || grid[i][j] == '0'){
        return;
    }
    dfs(grid,i-1,j,rows,columns);
    dfs(grid,i+1,j,rows,columns);
    dfs(grid,i,j-1,rows,columns);
    dfs(grid,i,j+1,rows,columns);
}