Perguntas sobre o pincel de Niukenet - Número de ilhas

Descrição do Problema

Dada uma matriz 01, 1 representa a terra e 0 representa o oceano. Se dois 1s são adjacentes, esses dois 1s pertencem à mesma ilha. Consideramos apenas cima, baixo, esquerda e direita como adjacentes.
Ilhas: a terra adjacente pode formar uma ilha (adjacente: cima, baixo, esquerda e direita) para determinar o número de ilhas.

Exemplo

Exemplo 1

Digite
[[1,1,0,0,0], [0,1,0,1,1], [0,0,0,1,1], [0,0,0,0,0], [0,0,1,1,1]]

Produto
3

Soluções

análise

  1. Atravesse a matriz, defina as ilhas adjacentes como 1 (você pode usar dfs ou bfs) e, a seguir, continue a julgar.

método

  1. dfs: comece a partir de um nó raiz de 1, visite a partir de cada nó adjacente 1 até o vértice (tudo ao redor é água) e, em seguida, visite outros 1 nós adjacentes ao vértice, por sua vez
  2. bfs: Para encontrar o número de ilhas, podemos escanear toda a grade bidimensional. Se uma posição for 1, ela será adicionada à fila e a primeira pesquisa em amplitude será iniciada. No processo de pesquisa em amplitude, cada 1 pesquisado será remarcado como 0. Até que a fila esteja vazia, a busca termina.

Código

dfs

// 思路1
public class Solution {
    
      
    void dfs(char[][] grid, int r, int c) {
    
    
        int len = grid.length;
        int len1 = grid[0].length;

        if (r < 0 || c < 0 || r >= len || c >= len1 || grid[r][c] == '0') {
    
    
            return;
        }

        grid[r][c] = '0';
        dfs(grid, r - 1, c);
        dfs(grid, r + 1, c);
        dfs(grid, r, c - 1);
        dfs(grid, r, c + 1);
    }

    public int numIslandsByDFS(char[][] grid) {
    
    
        if (grid == null || grid.length == 0) {
    
    
            return 0;
        }

        int len = grid.length;
        int len1 = grid[0].length;
        int numIslands = 0;
        for (int r = 0; r < len; ++r) {
    
    
            for (int c = 0; c < len1; ++c) {
    
    
                if (grid[r][c] == '1') {
    
    
                    ++numIslands;
                    dfs(grid, r, c);
                }
            }
        }

        return numIslands;
    }
}

Análise de complexidade de tempo:
O (MN): atravessa uma matriz bidimensional

Análise da complexidade do espaço:
O (MN): A complexidade do espaço aqui é principalmente para a profundidade da recursão. No pior caso, se a matriz bidimensional for apenas 1, você precisa recursar toda a matriz bidimensional o tempo todo.

bfs

// 思路2
public class Solution {
    
      
    public int numIslandsByBFS(char[][] grid) {
    
    
        if (grid == null || grid.length == 0) {
    
    
            return 0;
        }

        int len = grid.length;
        int len1 = grid[0].length;
        int numIslands = 0;

        for (int r = 0; r < len; ++r) {
    
    
            for (int c = 0; c < len1; ++c) {
    
    
                if (grid[r][c] == '1') {
    
    
                    ++numIslands;
                    grid[r][c] = '0';
                    Queue<Integer> neighbors = new LinkedList<>();
                    neighbors.add(r * len1 + c);
                    while (!neighbors.isEmpty()) {
    
    
                        int id = neighbors.remove();
                        int row = id / len1;
                        int col = id % len1;
                        if (row - 1 >= 0 && grid[row - 1][col] == '1') {
    
    
                            neighbors.add((row - 1) * len1 + col);
                            grid[row - 1][col] = '0';
                        }
                        if (row + 1 < len && grid[row + 1][col] == '1') {
    
    
                            neighbors.add((row + 1) * len1 + col);
                            grid[row + 1][col] = '0';
                        }
                        if (col - 1 >= 0 && grid[row][col - 1] == '1') {
    
    
                            neighbors.add(row * len1 + col - 1);
                            grid[row][col - 1] = '0';
                        }
                        if (col + 1 < len1 && grid[row][col + 1] == '1') {
    
    
                            neighbors.add(row * len1 + col + 1);
                            grid[row][col + 1] = '0';
                        }
                    }
                }
            }
        }

        return numIslands;
    }
} 

Análise de complexidade de tempo:
O (MN): atravessa uma matriz bidimensional

Análise da complexidade do espaço:
O (min (M, N)): No pior caso, toda a grade é terra e o tamanho da fila pode chegar a min (M, N).

Se você quiser fazer o teste, pode ir diretamente ao link da Niuke.com para fazer o teste

Número de ilhas-niuke.com

Acho que você gosta

Origin blog.csdn.net/qq_35398517/article/details/114005320
Recomendado
Clasificación