給定一個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]]
注意事項
返回的滿足條件的座標的任意一種排列即可。
n, m <= 150
class Solution {
public:
/**
* @param matrix: the given matrix
* @return: The list of grid coordinates
*/
vector<vector<int>> pacificAtlantic(vector<vector<int>> &matrix) {
// write your code here
vector<vector<int>>res;
int m=matrix.size();
if(m==0) return res;
int n=matrix[0].size();
if(n==0) return res;
vector<vector<bool>>pacific(m,vector<bool>(n,false));
vector<vector<bool>>Atlantic(m,vector<bool>(n,false));
for (int i = 0; i < m; i++) {
dfs(matrix,pacific,i,0);
dfs(matrix,Atlantic,i,n-1);
}
for(int i = 0; i < n; i++)
{
dfs(matrix,pacific,0,i);
dfs(matrix,Atlantic,m-1,i);
}
for (int i = 0; i < m; i++) {
for(int j = 0; j < n ;j++)
{
if(pacific[i][j]&&Atlantic[i][j])
{
vector<int>tmp;
tmp.push_back(i);
tmp.push_back(j);
res.push_back(tmp);
}
}
}
return res;
}
void dfs(const vector<vector<int>> &matrix,vector<vector<bool>> &visit,int row,int col)
{
if(row<0||col<0||row>=matrix.size()||col>=matrix[0].size()||visit[row][col]) return;
visit[row][col]=true;
if(row-1>=0&&matrix[row][col]<=matrix[row-1][col])
dfs(matrix,visit,row-1,col);
if(row+1<matrix.size()&&matrix[row][col]<=matrix[row+1][col])
dfs(matrix,visit,row+1,col);
if(col-1>=0&&matrix[row][col]<=matrix[row][col-1])
dfs(matrix,visit,row,col-1);
if(col+1<matrix[0].size()&&matrix[row][col]<=matrix[row][col+1])
dfs(matrix,visit,row,col+1);
}
};