417. problema del agua del Atlántico del Pacífico
Dado un número entero no negativo matriz mxn representa la altura de una célula individual en el continente. "Pacific" en la izquierda y en la frontera del continente, y "Atlántico" en la orilla derecha del continente y el límite inferior.
Sólo de acuerdo con una dirección predeterminada de flujo hacia arriba, abajo, izquierda y derecha de la corriente, o de alto a bajo y sólo puede fluir en la misma altura.
Por favor identifique los agua puede fluir tanto a "Pacífico", sino también para coordinar el flujo de la unidad de tierra "Atlántico".
consejos:
El orden no importa coordenadas de salida
M y N son menos de 150
Ejemplo:
Dada la matriz 5x5 siguiente:
太平洋 ~ ~ ~ ~ ~
~ 1 2 2 3 (5) *
~ 3 2 3 (4) (4) *
~ 2 4 (5) 3 1 *
~ (6) (7) 1 4 5 *
~ (5) 1 1 2 4 *
* * * * * 大西洋
Devuelve:
[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (la figura anterior en paréntesis medios).
class Solution {
private int row, col;
private int[][] grid;
private List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> pacificAtlantic(int[][] matrix) {
row = matrix.length;
if (row == 0) {
return result;
}
col = matrix[0].length;
grid = new int[row][col];
for (int i = 0; i < row; i++) {
helper(matrix, i, 0, 1);
}
for (int j = 0; j < col; j++) {
helper(matrix, 0, j, 1);
}
for (int i = 0; i < row; i++) {
helper(matrix, i, col - 1, 2);
}
for (int j = 0; j < col; j++) {
helper(matrix, row - 1, j, 2);
}
return result;
}
private void helper(int[][] matrix, int i, int j, int v) {
if (grid[i][j] == v || grid[i][j] == 3) {
return;
}
grid[i][j] += v;
if (grid[i][j] == 3) {
List<Integer> temp = new ArrayList<>();
temp.add(i);
temp.add(j);
result.add(temp);
}
if (i != 0 && matrix[i - 1][j] >= matrix[i][j]) {
helper(matrix, i - 1, j, v);
}
if (j != 0 && matrix[i][j - 1] >= matrix[i][j]) {
helper(matrix, i, j - 1, v);
}
if (i != row - 1 && matrix[i + 1][j] >= matrix[i][j]) {
helper(matrix, i + 1, j, v);
}
if (j != col - 1 && matrix[i][j + 1] >= matrix[i][j]) {
helper(matrix, i, j + 1, v);
}
}
}