contenido
2. Análisis de resolución de problemas
contenido
2. Método 1: Gráfico transversal
3. Método 2: Consolidar colecciones
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]
para1
o0
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...)