problema da água 417. Atlantic Pacific
Dado um número inteiro não negativo matriz mxn representa a altura de uma célula individual no continente. "Pacific" na esquerda e na fronteira do continente, e "Atlantic" na margem direita do continente e o limite inferior.
Apenas de acordo com uma predeterminada direcção de fluxo para cima, para baixo, para a esquerda e para a direita do fluxo, ou de alta para baixa e só pode fluir na mesma altura.
Por favor, identifique aqueles que a água pode fluir tanto para "Pacific", mas também para coordenar o fluxo de unidade de terra "Atlantic".
dicas:
A ordem não importa coordenadas de saída
de m e n são menos do que 150
exemplo:
Dada a seguinte matriz 5x5:
太平洋 ~ ~ ~ ~ ~
~ 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 *
* * * * * 大西洋
retorna:
[[0, 4] [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (figura acima em parênteses meios).
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);
}
}
}