Leetcode0547 Número de provincias (medio, DFS, BFS y colección)

contenido

1. Descripción del tema

2. Análisis de resolución de problemas

3. Implementación del código


contenido

1. Descripción del tema

2. Método 1: Gráfico transversal

2.1 Ideas

2.2 Implementación del Código

3. Método 2: Consolidar colecciones

3.1 Ideas

3.2 Implementación del Código


1. Descripción del tema

Hay  n una ciudad, algunas de las cuales están conectadas entre sí y otras que no. Si  a la ciudad está  b directamente conectada a la ciudad  b y la ciudad  c está directamente conectada a la ciudad, entonces la ciudad  está  indirectamente conectada a la a ciudad  .c

Una provincia  es un grupo de ciudades conectadas directa o indirectamente, excluyendo otras ciudades no conectadas.

Darte una  n x n matriz  isConnected , lo que  isConnected[i][j] = 1 significa que la  i ciudad enésima y la  j ciudad enésima están directamente conectadas, y las  isConnected[i][j] = 0 dos no están directamente conectadas.

Devuelve el número de  provincias de la matriz  .

Ejemplo 1:

Entrada: isConnected = [[1,1,0],[1,1,0],[0,0,1]]
 Salida: 2

Ejemplo 2:

Entrada: isConnected = [[1,0,0],[0,1,0],[0,0,1]]
 Salida: 3

insinuación:

  • 1 <= n <= 200
  • n == isConnected.length
  • n == isConnected[i].length
  • isConnected[i][j] para  1 o 0
  • isConnected[i][i] == 1
  • isConnected[i][j] == isConnected[j][i]

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/number-of-provinces Los
derechos de autor pertenecen a LeetCode.com. Para reimpresiones comerciales, comuníquese con la autorización oficial y para reimpresiones no comerciales, indique la fuente.

2. Método 1: Gráfico transversal

2.1 Ideas

        La traducción de provincias a "provincia" realmente tiene que ser aceptada. Afortunadamente, este es un símbolo y no afecta la solución.

        En esencia, es encontrar el número de regiones conectadas en un gráfico.

        Este gráfico está representado por una matriz de adyacencia representada por isConnected.

        Dado que se trata de un recorrido de gráfico completo, se puede realizar una búsqueda primero en anchura o una búsqueda primero en profundidad. Varios de estos temas han aparecido anteriormente en esta serie "Temas sobre los fundamentos de la teoría de grafos". Consulte "Fundamentos de la teoría de grafos" en las notas diarias de resolución de problemas de Leetcode (actualización dinámica...) de Benniu Slow Farming .

        La representación de la matriz de adyacencia hace que sea muy conveniente consultar los nodos adyacentes.

2.2 Implementación del Código

from typing import List
from collections import deque

class Solution:
    def findCircleNum(self, isConnected: List[List[int]]) -> int:
        if len(isConnected)==0:
            return 0
        
        N         = len(isConnected)
        islandCnt = 0
        q         = deque()
        visited   = set()
        for node in range(N):
            # print(node, visited)
            # find the next unvisited node
            if node not in visited:
                # print("Start node of the next island: ", node)
                # Start from this node to search the connected sub-graph
                q.append(node)
                visited.add(node)
                while len(q) > 0:
                    tmp = q.pop()
                    for k in range(N):
                        if isConnected[tmp][k]==1 and k not in visited:
                            q.append(k)
                            visited.add(k)
                islandCnt += 1
                
        return islandCnt        
    
if __name__ == '__main__':
    
    sln = Solution()
    
    isConnected = [[1,1,0],[1,1,0],[0,0,1]]
    print(sln.findCircleNum(isConnected))
    
    isConnected = [[1,0,0],[0,1,0],[0,0,1]]
    print(sln.findCircleNum(isConnected))

        El código anterior usa "q.pop()", que se combina con q.append(), lo que indica que q se usa como una pila, por lo que representa una búsqueda en profundidad. Y si se cambia a "q.popleft()", significa que se usa q como cola, por lo que se programa la búsqueda en amplitud. 

        Tiempo de ejecución: 44 ms, superó al 88,42 % de los usuarios en todas las confirmaciones de Python3

        Consumo de memoria: 15,4 MB, superando al 42,50 % de los usuarios en todas las confirmaciones de Python3

3. Método 2: Consolidar colecciones

3.1 Ideas

        Otra forma de calcular el número de componentes conectados es usar union-find. Inicialmente, cada provincia se inicializa para pertenecer a un componente conectado diferente. Atraviese la matriz isConnected, si hay una relación de conexión entre dos provincias, pertenecen al mismo componente conectado y las fusiona.

        Después de atravesar todos los elementos de la matriz isConnected, el número total de componentes conectados restantes es el número total de provincias.

        En la siguiente implementación, groupID se utiliza para almacenar el número de identificación del grupo al que pertenece el nodo correspondiente. Cada provincia se inicializa para contener solo su propio grupo en la inicialización. groupID es el ID o número de índice de cada provincia.

        A continuación, recorra de menor a mayor Para cada provincia, consulte el nodo con el número de índice más grande entre sus nodos adyacentes, y mézclese en el grupo de la provincia con el número de índice más grande. Al final, el número de provincias cuyo número de grupo no ha cambiado es el último número de grupo restante, que es el número de provincias requerido en esta pregunta.

3.2 Implementación del Código

class Solution:
    def findCircleNum_union_find(self, isConnected: List[List[int]]) -> int:
        def find(index: int) -> int:
            # Find the group to which the index belongs
            if groupID[index] != index:
                groupID[index] = find(groupID[index])
            return groupID[index]
        
        def union(index1: int, index2: int):
            # Join index1 into the group which index2 belongs to
            groupID[find(index1)] = find(index2)
        
        # Initialization.
        # Start from the state in which each province belongs to the own-group
        # Each group has one province with the same index as its initial root.
        groupID      = list(range(len(isConnected)))
        
        # For each group, find the (directly or indirectly) connected province and
        # join itself into the later group
        for i in range(len(isConnected)):
            for j in range(i + 1, len(isConnected)):
                if isConnected[i][j] == 1:
                    union(i, j)
        
        numGroup = sum(groupID[i] == i for i in range(len(isConnected)))
        return numGroup

        Tiempo de ejecución: 56 ms, superando al 44,57 % de los usuarios en todas las confirmaciones de Python3

        Consumo de memoria: 15,3 MB, superando al 54,80 % de los usuarios en todas las confirmaciones de Python3

        Volver al directorio principal: notas diarias de resolución de problemas de Leetcode (actualización dinámica...)

Supongo que te gusta

Origin blog.csdn.net/chenxy_bwave/article/details/124190467
Recomendado
Clasificación