Descrição do Problema
Dada uma matriz 01, 1 representa a terra e 0 representa o oceano. Se dois 1s são adjacentes, esses dois 1s pertencem à mesma ilha. Consideramos apenas cima, baixo, esquerda e direita como adjacentes.
Ilhas: a terra adjacente pode formar uma ilha (adjacente: cima, baixo, esquerda e direita) para determinar o número de ilhas.
Exemplo
Exemplo 1
Digite
[[1,1,0,0,0], [0,1,0,1,1], [0,0,0,1,1], [0,0,0,0,0], [0,0,1,1,1]]
Produto
3
Soluções
análise
- Atravesse a matriz, defina as ilhas adjacentes como 1 (você pode usar dfs ou bfs) e, a seguir, continue a julgar.
método
- dfs: comece a partir de um nó raiz de 1, visite a partir de cada nó adjacente 1 até o vértice (tudo ao redor é água) e, em seguida, visite outros 1 nós adjacentes ao vértice, por sua vez
- bfs: Para encontrar o número de ilhas, podemos escanear toda a grade bidimensional. Se uma posição for 1, ela será adicionada à fila e a primeira pesquisa em amplitude será iniciada. No processo de pesquisa em amplitude, cada 1 pesquisado será remarcado como 0. Até que a fila esteja vazia, a busca termina.
Código
dfs
// 思路1
public class Solution {
void dfs(char[][] grid, int r, int c) {
int len = grid.length;
int len1 = grid[0].length;
if (r < 0 || c < 0 || r >= len || c >= len1 || grid[r][c] == '0') {
return;
}
grid[r][c] = '0';
dfs(grid, r - 1, c);
dfs(grid, r + 1, c);
dfs(grid, r, c - 1);
dfs(grid, r, c + 1);
}
public int numIslandsByDFS(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int len = grid.length;
int len1 = grid[0].length;
int numIslands = 0;
for (int r = 0; r < len; ++r) {
for (int c = 0; c < len1; ++c) {
if (grid[r][c] == '1') {
++numIslands;
dfs(grid, r, c);
}
}
}
return numIslands;
}
}
Análise de complexidade de tempo:
O (MN): atravessa uma matriz bidimensional
Análise da complexidade do espaço:
O (MN): A complexidade do espaço aqui é principalmente para a profundidade da recursão. No pior caso, se a matriz bidimensional for apenas 1, você precisa recursar toda a matriz bidimensional o tempo todo.
bfs
// 思路2
public class Solution {
public int numIslandsByBFS(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int len = grid.length;
int len1 = grid[0].length;
int numIslands = 0;
for (int r = 0; r < len; ++r) {
for (int c = 0; c < len1; ++c) {
if (grid[r][c] == '1') {
++numIslands;
grid[r][c] = '0';
Queue<Integer> neighbors = new LinkedList<>();
neighbors.add(r * len1 + c);
while (!neighbors.isEmpty()) {
int id = neighbors.remove();
int row = id / len1;
int col = id % len1;
if (row - 1 >= 0 && grid[row - 1][col] == '1') {
neighbors.add((row - 1) * len1 + col);
grid[row - 1][col] = '0';
}
if (row + 1 < len && grid[row + 1][col] == '1') {
neighbors.add((row + 1) * len1 + col);
grid[row + 1][col] = '0';
}
if (col - 1 >= 0 && grid[row][col - 1] == '1') {
neighbors.add(row * len1 + col - 1);
grid[row][col - 1] = '0';
}
if (col + 1 < len1 && grid[row][col + 1] == '1') {
neighbors.add(row * len1 + col + 1);
grid[row][col + 1] = '0';
}
}
}
}
}
return numIslands;
}
}
Análise de complexidade de tempo:
O (MN): atravessa uma matriz bidimensional
Análise da complexidade do espaço:
O (min (M, N)): No pior caso, toda a grade é terra e o tamanho da fila pode chegar a min (M, N).
Se você quiser fazer o teste, pode ir diretamente ao link da Niuke.com para fazer o teste