El número de islas T200 para LeetCode (medio)

El tema de este tiempo es el número de islas T200 en LeetCode.
Inserte la descripción de la imagen aquí
No tengo mucho que decir. El tema es el siguiente: En primer lugar, vi el tema con un TAT aturdido, ¡no sé por dónde empezar!
Después de pensarlo detenidamente:
debemos atravesar la matriz, ¿verdad?
La clave es cómo juzgar si es una isla.
Tenemos que juzgar si está conectada. Por ejemplo, el punto de coordenadas actual es '1'. Si el lugar conectado a él es '1', significa que los dos puntos son una isla. Marcando esto como '1' ¡También necesitamos juzgar si los alrededores son '1'! Pero si una vez finalizado el juicio, se juzgarán también otros puntos a los ya juzgados, ¡qué se debe hacer! ? ?
Ahora que el punto juzgado ha sido juzgado, significa que no hay un '1' a su alrededor. Entonces podemos usar la idea de "infección" para cambiar el punto juzgado a '0', luego, al atravesar la matriz bidimensional, no conflicto.
Como se muestra en la siguiente figura:
Este es el primer '1' que se encuentra cuando atravesamos la matriz,
Inserte la descripción de la imagen aquí
y después de haber completado el juicio, lo cambiaremos a '0' y luego procederemos al siguiente juicio:
Inserte la descripción de la imagen aquí

De la figura anterior, podemos obtener nuestra idea: atraviesa la matriz, si el nodo actual es 1, luego usa la búsqueda en profundidad (DFS) de forma recursiva para cambiar el punto y cambia el nodo que atraviesa de 1 a 0.
Luego salimos, ¿Cómo diseñar un algoritmo?
Función recursiva (dfs) Primero que nada, tenemos que pensar en la condición final de la recursividad, naturalmente, cuando las coordenadas están fuera de límites, ¿qué más? Cuando la coordenada actual sea '0', ¡terminaremos la búsqueda desde ese punto en adelante! Esta es la condición final.
Siguiente en el código:

class Solution {
    public int numIslands(char[][] grid) {
        //判空
        if(grid==null||grid.length==0){
            return 0;
        }

        int landNum=0; //岛屿个数
        //遍历数组
        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[0].length;j++){
            if(grid[i][j]=='1'){
                landNum++; //在这里进行岛屿的增加
                dfs(grid,i,j);//深度优先搜索,遍历
            }
            }
        }
        return landNum;
    }
 //递归函数
    public void dfs(char[][] grid,int i,int j){
        //结束条件,坐标越界,或者当前位'0'
        if(i<0||j<0||i>=grid.length||j>=grid[0].length||grid[i][j]=='0'){
            return ;
        }
        
        //将当前的点变为'0' 然后对上下左右的点进行递归
        grid[i][j]='0';
        dfs(grid,i-1,j);
        dfs(grid,i+1,j);
        dfs(grid,i,j-1);
        dfs(grid,i,j+1);
    }
}

La dificultad de esta pregunta es cómo juzgar cómo se forma una isla, y luego no repetirá el juicio anterior cuando atraviese a otras cosas, ¡así como las condiciones recursivas y la escritura!
Inserte la descripción de la imagen aquíEste es el tema de esta explicación. Si hay alguna necesidad de mejora, deje un mensaje a continuación, ¡gracias!

Supongo que te gusta

Origin blog.csdn.net/Pzzzz_wwy/article/details/105647153
Recomendado
Clasificación