417: Pacific-Atlantic-Water-Flow
Medium
table of contents
Simply, have 2 m by n matrices
(where m denotes heights.size(), and
n denotes heights[0].size()); one for the
pacific ocean and the other for the atlantic
ocean.
Then, you can just run BFS from every square cell that borders an island edge:
- BFS for the
pacificocean from every square cell that borders the left and top edge - BFS for the
atlanticocean from every square cell that borders the right and bottom edge
Afterwards, just iterate through and check both matrices to verify
the cells that rain water can flow to both the
pacific and atlantic oceans from.
code
class Solution {
public:
vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
int m = heights.size(), n = heights[0].size();
vector<vector<int>> pacific (m, vector<int>(n));
vector<vector<int>> atlantic (m, vector<int>(n));
for (int i = 0; i < m; ++i) dfs(i, 0, pacific, heights);
for (int j = 0; j < n; ++j) dfs(0, j, pacific, heights);
for (int i = 0; i < m; ++i) dfs(i, n-1, atlantic, heights);
for (int j = 0; j < n; ++j) dfs(m-1, j, atlantic, heights);
vector<vector<int>> ans;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (pacific[i][j] && atlantic[i][j]) {
ans.push_back({i, j});
}
}
}
return ans;
}
private:
vector<vector<int>> direction = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
void dfs (int r, int c, vector<vector<int>>& ocean, vector<vector<int>>& heights) {
ocean[r][c] = 1;
for (int i = 0; i < 4; ++i) {
int newR = r + direction[i][0], newC = c + direction[i][1];
if (newR >= 0 && newC >= 0 && newR < ocean.size() && newC < ocean[0].size() && !ocean[newR][newC] && heights[r][c] <= heights[newR][newC]) {
dfs(newR, newC, ocean, heights);
}
}
}
};