1. 解析
题目大意,找出能同时流向太平洋和印度洋的区域,太平洋区域为左边和上边,印度洋区域为右边和下边。只有当前区域高度大于或等于相邻区域高度才能流向该区域
2. 分析
刚开始看到这题,我第一反映就是Surrounded Regions,但这里最大的不同在于有两个区域,而不是仅仅只有一个区域,最初我以为要设计两个递归函数,一个检测是否能流向太平洋,另外一个检测是否能流向印度洋,但感觉不是很合理。参考@Grandyang博主的思路,感觉他的解法也很巧妙。实际上无需设计两个递归,我们只需从边缘向中间检测即可,然后分别用两个不同的数组分别表示流向太平洋和印度洋的点,最后根据这两个数组即可判断是否能同时流向太平洋和印度洋。思路和Surrounded Regions差不多,只需利用两个数组存储两种不同状态即可。
class Solution {
public:
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>> atlantic(m, vector<bool>(n, false));
vector<vector<bool>> pacific(m, vector<bool>(n, false));
vector<vector<int>> res;
for (int row = 0; row < m; ++row){ //从 左/右 边缘开始检测
DFS(matrix, row, 0, INT_MIN, atlantic);
DFS(matrix, row, n-1, INT_MIN, pacific);
}
for (int col = 0; col < n; ++col){ //从 上/下 边缘开始检测
DFS(matrix, 0, col, INT_MIN, atlantic);
DFS(matrix, m-1, col, INT_MIN, pacific);
}
for (int row = 0; row < m; ++row){
for (int col = 0; col < n; ++col){
if (atlantic[row][col] && pacific[row][col])
res.push_back({row, col});
}
}
return res;
}
void DFS(vector<vector<int>>& matrix, int row, int col, int pre, vector<vector<bool>>& visited){
int m = matrix.size(), n = matrix[0].size();
if (row < 0 || col >= n || row >= m || col < 0 || visited[row][col] || matrix[row][col] < pre)
return;
visited[row][col] = true;
DFS(matrix, row-1, col, matrix[row][col], visited); //上
DFS(matrix, row, col+1, matrix[row][col], visited); //右
DFS(matrix, row+1, col, matrix[row][col], visited); //下
DFS(matrix, row, col-1, matrix[row][col], visited); //左
}
};
3. 类似的题目
来源:CSDN
作者:Czy_whlg
链接:https://blog.csdn.net/Czyaun/article/details/103581556