给定一个m×n
的非负矩阵代表一个大洲,矩阵的每个单元格的值代表此处的地形高度,矩阵的左边缘和上边缘是“太平洋”,下边缘和右边缘是“大西洋”。
水流只能在四个方向(上,下,左或右)从一个单元格流向另一个海拔和自己相等或比自己低的单元格。
找到那些从此处出发的水既可以流到“太平洋”,又可以流向“大西洋”的单元格的坐标。
样例
例1:
输入:
matrix =
[[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]]
解释:
Pacific ~ ~ ~ ~ ~
~ 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 *
* * * * * Atlantic
例2:
输入:
matrix =
[[1,2],
[4,3]]
输出:
[[0,1],[1,0],[1,1]]
注意事项
1.返回的满足条件的坐标的任意一种排列即可。
2.'n,m<=150'。
解题思路:
从四周往内部dfs,最后判断哪些点两个大洋都可达。
public class Solution {
/**
* @param matrix: the given matrix
* @return: The list of grid coordinates
*/
public List<List<Integer>> pacificAtlantic(int[][] matrix) {
// write your code here
List<List<Integer>> res = new ArrayList<>();
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return res;
}
row = matrix.length;
col = matrix[0].length;
boolean[][]Pacific = new boolean[row][col];
boolean[][]Atlantic = new boolean[row][col];
//从四周开始深搜
for(int i = 0;i < row;i++){
dfs(matrix, Pacific, Integer.MIN_VALUE, i, 0);
dfs(matrix, Atlantic, Integer.MIN_VALUE, i, col - 1);
}
for(int i = 0;i < col;i++){
dfs(matrix, Pacific, Integer.MIN_VALUE, 0, i);
dfs(matrix, Atlantic, Integer.MIN_VALUE, row - 1, i);
}
//求两者交集,即为结果
for(int i = 0;i < row;i++){
for(int j = 0;j < col;j++){
if(Pacific[i][j] && Atlantic[i][j]){
List<Integer> temp = new ArrayList<>();
temp.add(i);
temp.add(j);
res.add(temp);
}
}
}
return res;
}
int row;
int col;
int[][] p = {{0,1},{0,-1},{1,0},{-1,0}};
public void dfs(int[][] matrix, boolean[][] visited, int height, int x, int y){
if(x < 0 || x >=row || y < 0 || y >= col || matrix[x][y] < height || visited[x][y]){
return;
}
visited[x][y] = true;
for(int i = 0;i < 4;i++){
dfs(matrix, visited, matrix[x][y], x + p[i][0], y + p[i][1]);
}
}
}