417. Pacific Atlantic Water Flow
Last updated
Last updated
/**
* Time complexity : O(N^2)
* Space complexity : O(N^2)
*/
class Solution {
public List<List<Integer>> pacificAtlantic(int[][] matrix) {
List<List<Integer>> result = new ArrayList();
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return result;
}
int m = matrix.length, n = matrix[0].length;
boolean[][] pacific = new boolean[m][n];
boolean[][] atlantic = new boolean[m][n];
for(int j = 0; j < n; j++) {
dfs(0, j, pacific, matrix, Integer.MIN_VALUE);
dfs(m-1, j, atlantic, matrix, Integer.MIN_VALUE);
}
for(int i = 0; i < m; i++) {
dfs(i, 0, pacific, matrix, Integer.MIN_VALUE);
dfs(i, n-1, atlantic, matrix, Integer.MIN_VALUE);
}
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(pacific[i][j] && atlantic[i][j]) {
result.add(Arrays.asList(i, j));
}
}
}
return result;
}
private void dfs(int i,
int j,
boolean[][] canReach,
int[][] matrix,
int prevHeight) {
if(i < 0 || i >= matrix.length ||
j < 0 || j >= matrix[0].length ||
canReach[i][j] ||
matrix[i][j] < prevHeight) {
return;
}
canReach[i][j] = true;
dfs(i+1, j, canReach, matrix, matrix[i][j]);
dfs(i-1, j, canReach, matrix, matrix[i][j]);
dfs(i, j-1, canReach, matrix, matrix[i][j]);
dfs(i, j+1, canReach, matrix, matrix[i][j]);
}
}