Leetcode200 Número de islas (preguntas clásicas de la entrevista)

leetcode 200 número de islas

leetcode 200 número de islas

Dada una cuadrícula bidimensional compuesta por '1' (tierra) y '0' (agua), cuente el número de islas en la cuadrícula.
Las islas siempre están rodeadas de agua, y cada isla solo se puede formar conectando tierras adyacentes en dirección horizontal y / o vertical.
Además, puede asumir que los cuatro lados de la cuadrícula están rodeados de agua.

Ejemplo 1:
Entrada: cuadrícula = [
["1", "1", "1", "1", "0"],
["1", "1", "0", "1", "0" ],
["1", "1", "0", "0", "0"],
["0", "0", "0", "0", "0"]
]
salida: 1

Ejemplo 2:
Entrada: cuadrícula = [
["1", "1", "0", "0", "0"],
["1", "1", "0", "0", "0" ],
["0", "0", "1", "0", "0"],
["0", "0", "0", "1", "1"]
]
salida: 3

Sugerencia:
m == grid.length
n == grid [i] .length
1 <= m, n <= 300
grid [i] [j] es '0' o '1'.
Solución 1:

//采用 dfs 的方法求解
public class Solution {
    
    
    public int numIslands(char[][] grid) {
    
    
        //边界判断 grid 是空或者长度为0 那么直接返回 0
        if (grid == null || grid.length == 0)
            return 0;
        // 得出行列信息 和统计结果信息
        int row = grid.length;
        int col = grid[0].length;
        int res = 0;
        //循环遍历
        for (int i = 0; i < row; i++) {
    
    
            for (int j = 0; j < col; j++) {
    
    
                if (grid[i][j] == '1') {
    
    
                    res += 1;
                    dfs(grid, i, j, row, col);
                }
            }
        }
        return res;
    }

    private void dfs(char[][] grid, int x, int y, int row, int col) {
    
    
        //递归终止条件
        if (x < 0 || y < 0 || x >= row || y >= col || grid[x][y] == '0')
            return;
        grid[x][y] = '0';
        dfs(grid, x - 1, y, row, col);
        dfs(grid, x + 1, y, row, col);
        dfs(grid, x, y - 1, row, col);
        dfs(grid, x, y + 1, row, col);
    }
}

Respuesta 2:

//采用bfs的方法解决,需要维护一个队列
class Solution {
    
    
    public int numIslands(char[][] grid) {
    
    
        // 边界条件判断
        if (grid == null || grid.length == 0) return 0;
        // 行列计算
        int row = grid.length;
        int col = grid[0].length;
        int res = 0;
        //维护一个队列 , 里边存放的是 当值为'1' 是当二维数组索引 ,数组类型
        Queue<int[]> queue = new LinkedList<>();
        for (int i = 0; i < row; i++) {
    
    
            for (int j = 0; j < col; j++) {
    
    
                if (grid[i][j] == '1') {
    
    
                    res += 1;
                    queue.add(new int[]{
    
    i, j});
                    grid[i][j] = '0';
                    while (queue.size() > 0) {
    
    
                        int[] cur = queue.remove();
                        int x = cur[0];
                        int y = cur[1];
                        //进行上下左右判断,同化操作
                        if (x - 1 >= 0 && grid[x - 1][y] == '1') {
    
    
                            queue.add(new int[]{
    
    x - 1, y});
                            grid[x - 1][y] = '0';
                        }
                        if (y - 1 >= 0 && grid[x][y - 1] == '1') {
    
    
                            queue.add(new int[]{
    
    x, y - 1});
                            grid[x][y - 1] = '0';
                        }
                        if (x + 1 < row && grid[x + 1][y] == '1') {
    
    
                            queue.add(new int[]{
    
    x + 1, y});
                            grid[x + 1][y] = '0';
                        }
                        if (y + 1 < col && grid[x][y + 1] == '1') {
    
    
                            queue.add(new int[]{
    
    x, y + 1});
                            grid[x][y + 1] = '0';
                        }
                    }
                }
            }
        }
        return res;
    }
}

Respuesta 3:

// 采用并查集的方法求解,涉及二维数组-> 一维数组索引的变换
class Solution {
    
    
    public int numIslands(char[][] grid) {
    
    
        if (grid == null || grid.length == 0) {
    
    
            return 0;
        }
        int row = grid.length;
        int col = grid[0].length;
        int waters = 0;
        UnionFind uf = new UnionFind(grid);
        for (int i = 0; i < row; i++) {
    
    
            for (int j = 0; j < col; j++) {
    
    
                if (grid[i][j] == '0') {
    
    
                    waters++;
                } else {
    
    
                    int[][] directions = new int[][]{
    
    {
    
    0,1}, {
    
    0, -1}, {
    
    1, 0}, {
    
    -1, 0}};
                    for (int[] dir : directions) {
    
    
                        int x = i + dir[0];
                        int y = j + dir[1];
                        if (x >= 0 && y >= 0 && x < row && y < col && grid[x][y] == '1') {
    
    
                            uf.union(x*col+y, i*col+j);
                        }
                    }
                }
            }
        }
        return uf.getCount() - waters;
    }
}

class UnionFind {
    
    
    private int[] root = null;
    private int count = 0;
    
    public UnionFind(char[][] grid) {
    
    
        int row = grid.length;
        int col = grid[0].length;
        count = row * col;
        root = new int[row*col];
        for(int i = 0; i < row*col; i++) {
    
    
            root[i] = i;
        }
    }

    // Find the root of X
    public int find(int x) {
    
    
        if (x == root[x]) {
    
    
            return x;
        }
        return root[x] = find(root[x]);
    }

    // Union two element into one root
    public void union(int x, int y) {
    
    
        int rootX = find(x);
        int rootY = find(y);
        if (rootX != rootY) {
    
    
            root[rootX] = rootY;
            count--;
        }
    }

    public int getCount() {
    
    
        return count;
    }
}

Promover

ApsaraDB para RDS MySQL es una de las bases de datos de código abierto más populares del mundo. Como parte importante de la combinación de software de código abierto LAMP (Linux + Apache + MySQL + Perl / PHP / Python), se utiliza ampliamente en varios escenarios de aplicaciones. .
Haga clic para ver - >>> beneficios de base de datos de la nube de Año Nuevo, los nuevos usuarios son 1% de descuento, los modelos populares son un 50% a un 80% de descuento, MySQL sólo cuesta 19,9 yuanes al año .
Servidor de la nube ECS
nube de servidor ECS (Servicio elástico Compute) es Unos servicios de computación en la nube elásticos y escalables pueden ayudarlo a reducir los costos de TI, mejorar la eficiencia de operación y mantenimiento y permitirle concentrarse más en la innovación empresarial central. Soporte técnico profesional de preventa para ayudarlo a elegir el plan de configuración más adecuado
Haga clic para ver - >>> 10 años de profunda acumulación técnica de computación flexible, tecnología líder, excelente desempeño y estabilidad como una roca .
Servicio de mensajes cortos (Mensaje corto Service) es rápido para la mayoría de los clientes corporativos Aproveche las capacidades de comunicación preferidas por los usuarios de teléfonos móviles. Llame a la API o use el asistente de envío grupal para enviar códigos de verificación, notificaciones y mensajes de texto de marketing; los mensajes de texto de verificación nacionales se pueden alcanzar en segundos, con una tasa de llegada de hasta el 99%; mensajes de texto internacionales / de Hong Kong, Macao y Taiwán cubre más de 200 países y regiones, seguro, estable y ampliamente utilizado por empresas extranjeras.
Haga clic para ver - >>> nuevos usuarios del servicio SMS 0 yuanes de prueba gratuita .

Supongo que te gusta

Origin blog.csdn.net/weixin_45681506/article/details/115016209
Recomendado
Clasificación