题目描述:
给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。
规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。
请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。
提示:
输出坐标的顺序不重要
m 和 n 都小于150
示例:
给定下面的 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 *
-
-
-
-
- 大西洋
-
-
-
-
返回:
[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上图中带括号的单元).
方法1:
主要思路:解题链接汇总
(1)参考大佬题解,模拟从海水到陆地的漫灌过程;
(2)直到两个海洋的漫灌过程相遇,则是可以都流向两个海洋的陆地;
class Solution {
public:
//标识出从当前位置可以漫灌到的陆地;
void dfs(vector<vector<int>>&matrix,vector<vector<bool>>& sign,int pre_max,int row,int col,vector<pair<int,int>>&dirs){
if(row<0||row==matrix.size()||col<0||col==matrix[0].size()||sign[row][col]||matrix[row][col]<pre_max){
return;
}
sign[row][col]=true;
for(int i=0;i<dirs.size();++i){
dfs(matrix,sign,matrix[row][col],row+dirs[i].first,col+dirs[i].second,dirs);
}
}
vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) {
if(matrix.empty()||matrix[0].empty()){
return {};
}
int m=matrix.size(),n=matrix[0].size();
//两种海洋漫灌的陆地的标识数组
vector<vector<bool>> sign_1(m,vector<bool>(n,false));
vector<vector<bool>> sign_2(m,vector<bool>(n,false));
//漫灌的四个方向
vector<pair<int,int>> dirs={{1,0},{-1,0},{0,1},{0,-1}};
for(int i=0;i<m;++i){
dfs(matrix,sign_1,INT_MIN,i,0,dirs);
dfs(matrix,sign_2,INT_MIN,i,n-1,dirs);
}
for(int i=0;i<n;++i){
dfs(matrix,sign_1,INT_MIN,0,i,dirs);
dfs(matrix,sign_2,INT_MIN,m-1,i,dirs);
}
vector<vector<int>>res;
//都能漫灌的位置存入到结果中
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
if(sign_1[i][j]&&sign_2[i][j]){
res.push_back({i,j});
}
}
}
return res;
}
};