太平洋大西洋水流问题
题目解析
给定一个二维数组 heights,其中 heights[i][j] 表示该单元格的高度。
当附近相邻单元格的高度小于等于当前单元格高度时,当前单元格雨水可以流向附近单元格(雨水可以从边缘单元格流向海洋)。
要求找出既可以流向太平洋(左、上部分),又可以流向大西洋(右、下部分)的单元格。
算法思路
简单来说这道题就是找出既与左、上部分相连,又与右、下部分相连的所有单元格。
直接遍历判断每一个单元格是否可以流向左上、右下部分比较麻烦。这里可以从边缘单元格开始遍历,记录每一个连通(可以流向边缘)的单元格,最后找出既可以流向左上部分、又可以流向右下部分的单元格即可。
代码实现
class Solution {
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
public:
void dfs(vector<vector<int>>& heights, int i, int j, vector<vector<bool>>& vis) {
vis[i][j] = true;
int m = heights.size();
int n = heights[0].size();
for(int k = 0; k < 4; k++) {
int x = i + dx[k];
int y = j + dy[k];
if(x >= && x < m && y >= && y < n && !vis[x][y] && heights[i][j] <= heights[x][y])
(heights, x, y, vis);
}
}
vector<vector<>> (vector<vector<>>& heights) {
m = heights.();
n = heights[].();
vector<vector<>> (m, <>(n, ));
vector<vector<>> (m, <>(n, ));
( i = ; i < n; i++) {
(!pac[][i]) (heights, , i, pac);
(!atl[m][i]) (heights, m, i, atl);
}
( i = ; i < m; i++) {
(!pac[i][]) (heights, i, , pac);
(!atl[i][n]) (heights, i, n, atl);
}
vector<vector<>> ret;
( i = ; i < m; i++) {
( j = ; j < n; j++) {
(pac[i][j] && atl[i][j]) ret.({i, j});
}
}
ret;
}
};


