leetcode-dfs-417. 太平洋大西洋水流问题
解析参考:
class Solution { public: vector<vector<bool>> P, A; vector<vector<int>> res; // 保存结果 vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) { int m = heights.size(); int n = heights[0].size(); P = vector<vector<bool>>(m, vector<bool>(n, 0)); // 学到1招,可以这样定义全局变量 A = vector<vector<bool>>(m, vector<bool>(n, 0)); // vector<vector<bool>> P(m,vector<bool>(n,false)); // 保存太平洋访问记录 // vector<vector<bool>> A(m,vector<bool>(n,false)); // 保存大西洋访问记录 // 左边界和上边界肯定可以访问太平洋 // 右边界和下边界肯定可以访问大西洋 // 从边界出发,逆流而上,最后重合的地方就是结果 for(int i = 0; i < m; i++){ dfs(heights,P,i,0); // 左边 dfs(heights,A,i,n-1); // 右边 } for(int i = 0; i < n; i++){ dfs(heights,P,0,i); // 上边 dfs(heights,A,m-1,i); // 下边 } return res; } void dfs(vector<vector<int>>& heights, vector<vector<bool>>& visited,int i, int j){ int m = heights.size(); int n = heights[0].size(); if(visited[i][j]) // 说明访问过,直接返回 return; visited[i][j] = true; // 如果没有访问过,标记为true,为访问过 // P[i][j]和A[i][j]为true说明太平洋和大西洋都能通过逆流而上到达这个节点 // 反之,这个节点也能从两遍顺流如大洋中。 if(P[i][j]&&A[i][j]) res.push_back({i,j}); if(i-1>=0&&heights[i-1][j]>=heights[i][j]) dfs(heights,visited,i-1,j); if(i+1<m&&heights[i+1][j]>=heights[i][j]) dfs(heights,visited,i+1,j); if(j-1>=0&&heights[i][j-1]>=heights[i][j]) dfs(heights,visited,i,j-1); if(j+1<n&&heights[i][j+1]>=heights[i][j]) dfs(heights,visited,i,j+1); } };