1、前言
这个问题的意思是,二维数组的一个坐标,既可以流到“太平洋”,又可以流到“大西洋”。
2、思路
从海洋开始逆流 如果可以逆流到 就标记为1 然后检查两个海洋都可以逆流到的区域
3、代码
class Solution {
public List<List<Integer>> pacificAtlantic(int[][] matrix) {
if(matrix.length == 0 || matrix[0].length == 0){
return new ArrayList<>();
}
int m = matrix.length;
int n = matrix[0].length;
int[][] pecific = new int[m][n];
int[][] atlantic = new int[m][n];
// 从海洋边界开始
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
// 从太平洋边界流动
if(i == 0 || j == 0){
dfs(matrix, pecific, i, j, matrix[i][j]);
}
// 从大西洋边界流动
if(i == m -1 || j == n - 1){
dfs(matrix, atlantic, i, j, matrix[i][j]);
}
}
}
List<List<Integer>> res = new ArrayList<>();
// 都能到达的区域
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(pecific[i][j] == 1 && atlantic[i][j] == 1){
res.add(Arrays.asList(i, j));
}
}
}
return res;
}
private void dfs(int[][] matrix, int[][] aux, int i, int j, int pre){
// 判断边界
if(i < 0 || j < 0 || i >= matrix.length || j >= matrix[0].length
// 已经流到过了
|| aux[i][j] == 1
// 不能流动
|| matrix[i][j] < pre){
return;
}
aux[i][j] = 1;
dfs(matrix, aux, i - 1, j, matrix[i][j]);
dfs(matrix, aux, i + 1, j, matrix[i][j]);
dfs(matrix, aux, i, j - 1, matrix[i][j]);
dfs(matrix, aux, i, j + 1, matrix[i][j]);
}
}