给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。
规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。
请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。
提示:
示例:
给定下面的 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]] (上图中带括号的单元).
创建两个bool矩阵,分别记录(i,j)位置能否到达左上边界以及右下边界。
首先分析(i,j)是否能达到左上边界,即求左上矩阵。
从边界出发开始扩展,如果符合条件则true,继续递归,不符合则直接返回;(相当于是找左上边界的连通域,连通的条件是后面的值要大于等于前面的值);
右下矩阵同理;
class Solution {
private:
void dfs(vector<vector<int>> & matrix, int x, int y, int row, int col, vector<vector<bool>> & visited, int preNum){
if (x < 0 || x >= row || y < 0 || y >= col || visited[x][y] || matrix[x][y] < preNum)
return ;
visited[x][y] = true;
dfs(matrix, x + 1, y, row, col, visited, matrix[x][y]);
dfs(matrix, x - 1, y, row, col, visited, matrix[x][y]);
dfs(matrix, x, y + 1, row, col, visited, matrix[x][y]);
dfs(matrix, x, y - 1, row, col, visited, matrix[x][y]);
}
public:
vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) {
if (matrix.empty() || matrix[0].empty())
return {
};
int row = matrix.size(), col = matrix[0].size();
vector<vector<bool>> leftTop(row, vector<bool>(col, false));
vector<vector<bool>> rightDown(row, vector<bool>(col, false));
for (int i = 0; i < col; ++i){
dfs(matrix, 0, i, row, col, leftTop, matrix[0][i]);
dfs(matrix, row - 1, i, row, col, rightDown, matrix[row - 1][i]);
}
for (int i = 0; i < row; ++i){
dfs(matrix, i, 0, row, col, leftTop, matrix[i][0]);
dfs(matrix, i, col - 1, row, col, rightDown, matrix[i][col - 1]);
}
vector<vector<int>> res;
for (int i = 0; i < row; ++i){
for (int j = 0; j < col; ++j){
if (leftTop[i][j] && rightDown[i][j])
res.push_back({
i, j});
}
}
return res;
}
};