主页有其他数据结构内容(持续更新中)
难度:Medium
代码:
class Solution {
private:
int direction[4][2] = {0, 1, 1, 0, 0, -1, -1, 0}; // 保存四个方向
void dfs(vector<vector<int>>& heights, vector<vector<bool>>& visited, int x, int y) {
if(visited[x][y]) {
return;
}
visited[x][y] = true;
for(int k = 0; k < 4; k++) {
int nextX = x + direction[k][0];
int nextY = y + direction[k][1];
if(nextX < 0 || nextX >= heights.size() || nextY < 0 || nextY >= heights[0].size()) {
continue;
}
if(heights[x][y] > heights[nextX][nextY]) {
continue;
}
dfs(heights, visited, nextX, nextY);
}
}
public:
vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
vector<vector<int>> result;
int m = heights.size();
int n = heights[0].size();
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(heights, pacific, i, 0); // 遍历最左列,从太平洋流出
dfs(heights, atlantic, i, n - 1); // 遍历最右列,从大西洋流出
}
for(int j = 0; j < n; j++) {
dfs(heights, pacific, 0, j); // 遍历最上行,从太平洋流出
dfs(heights, atlantic, m - 1, j); // 遍历最下行,从大西洋流出
}
for(int p = 0; p < m; p++) {
for(int q = 0; q < n; q++) {
if(pacific[p][q] && atlantic[p][q]) {
result.push_back({p, q});
}
}
}
return result;
}
};