Escova LeetCode a partir do zero - o número de ilhas

Título:

  Dê a você uma grade bidimensional composta por '1' (terra) e '0' (água); por favor, conte o número de ilhas na grade. As ilhas estão sempre cercadas por água e cada ilha só pode ser formada por conexões terrestres adjacentes horizontais e / ou verticais. Além disso, você pode assumir que todos os quatro lados da grade estão cercados por água.

Exemplos:

Digite:

         11110

         11010

         11000

         00000

Saída: 1

Fonte: LeetCode

 

Método 1: pesquisa profunda

  Esse problema pode ser considerado como um problema de encontrar o valor do vizinho mais próximo. Em uma grade, os vizinhos mais próximos definidos aqui são para cima, para baixo, para a esquerda e para a direita. Em seguida, podemos percorrer a profundidade da mesma maneira que a árvore binária, assumindo que seja equivalente a uma "árvore quádrupla". Mas, dessa maneira, haverá repetições durante o processo de travessia, portanto, definimos todos os '1s encontrados' como '0' durante o processo de pesquisa profunda, para evitar repetições.

1  # 深度 搜索
2  class Solução (objeto):
 3      def numIslands (auto, grade):
 4          nums = 0
 5          para i na faixa (len (grade)):
 6              para j na faixa (len (grade [0])) :
 7                  se grade [i] [j] == ' 1 ' :
 8                      self.search_depth (grade, i, j)
 9                      nums + = 1
 10          return nums
 11  
12      def search_depth (self, grade, x, y):
 13          E sex> = len (grade) ou y> = len (grade [0]) ou x <0 ou y < 0:
 14              retornam  
15          
16          se grade [x] [y] == ' 1 ' :
 17              grade [x] [y] = ' 0 ' 
18              self.search_depth (grade, x-1 , y)
 19              self.search_depth (grade, x, y-1 )
 20              self.search_depth (grade, x + 1 , y)
 21              self.search_depth (grade, x, y + 1 )

 

 Método 2: pesquisa ampla

  Ele pode ser resolvido por uma pesquisa profunda, mas o processo recursivo ocupará muita memória, para que possamos substituir o processo recursivo por uma lista. Quando passamos para um ponto, ele é '1' e se torna um ponto de ilha, então adicionamos os pontos de ilha vizinhos, ou seja, os pontos de '1' para cima, para baixo, esquerda e direita, em uma lista e, em seguida, continuamente a partir da lista Retire o ponto da ilha como o ponto central da ilha e adicione as ilhas vizinhas à lista novamente, até que a lista esteja vazia, o cálculo seja concluído. Isso substitui todo o processo recursivo por uma lista.

1  # 搜索 搜索
2  class Solução (objeto):
 3      def numIslands (auto, grade):
 4          nr = len (grade)
 5          se nr == 0:
 6              retorno 0
 7          nc = len (grade [0])
 8          num_islands = 0
 9          para r na faixa (nr):
 10              para c na faixa (nc):
 11                  se a grade [r] [c] == " 1 " :
 12                      num_islands + = 1
13                      grid [r] [c] = " 0 " 
14                      vizinhos = collections.deque ([(r, c)])
 15                      enquanto vizinhos:
 16                          linhas, col = neighbours.popleft ()
 17                          para x, y em [(linha - 1, col), (linha + 1, col), (linha, col - 1), (linha, col + 1 )]:
 18                              se 0 <= x <nr e 0 <= y <nc e grade [x ] [y] == " 1 " :
 19                                  vizinhos.append ((x, y))
 20                                 grade [x] [y] = " 0 " 
21          retornar num_islands

 

Acho que você gosta

Origin www.cnblogs.com/fsencen/p/leetcode2.html
Recomendado
Clasificación