417太平洋大西洋の水問題
非負整数m×nのマトリックス所与本土上の個々のセルの高さを表しています。大陸の右の境界と下側境界の左にあると大陸の国境に「太平洋」、および「大西洋」。
流れのみの所定のアップ流れ、下、左、右方向に応じて、またはハイからローへと、同じ高さに流れることができます。
これらの水は「太平洋」の両方に流れることができるが、また、「大西洋」陸上ユニットの流れを調整するために特定してください。
ヒント:
順序は、出力座標は問題ではない
未満150及びm nは
例:
以下の5×5の行列を考えます:
太平洋 ~ ~ ~ ~ ~
~ 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 *
* * * * * 大西洋
戻り値:
[0,4]、[1,3]、[1,4]、[2,2]、[3,0]、[3,1]、[4,0](括弧内の上図手段)。
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);
}
}
}