赞
踩
有一个 m × n 的长方形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。
这个岛被分割成一个个方格网格。给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。
岛上雨水较多,如果相邻小区的高度 小于或等于 当前小区的高度,雨水可以直接向北、南、东、西流向相邻小区。水可以从海洋附近的任何细胞流入海洋。
返回 网格坐标 result 的 2D列表 ,其中 result[i] = [ri, ci] 表示雨水可以从单元格 (ri, ci) 流向 太平洋和大西洋 。
// 从四个边界开始深度遍历, class Solution { public: vector<vector<int>> P, A, ans; int n, m; vector<vector<int>> pacificAtlantic(vector<vector<int>>& M) { n = M.size(), m = M[0].size(); P = A = vector<vector<int>>(n, vector<int>(m, 0)); //左右两边加上下两边出发深搜 for(int i = 0; i < n; ++i) dfs(M, P, i, 0), dfs(M, A, i, m - 1); for(int j = 0; j < m; ++j) dfs(M, P, 0, j), dfs(M, A, n - 1, j); return ans; } void dfs(vector<vector<int>>& M, vector<vector<int>>& visited, int i, int j){ if(visited[i][j]) return; // 引用P和A,并当作访问标志位; visited[i][j] = 1; if(P[i][j] && A[i][j]) ans.push_back({i,j}); // 遍历的同时判断PA两个矩阵是否在i,j处都为1,是的话就代表 //上下左右深搜 if(i-1 >= 0 && M[i-1][j] >= M[i][j]) dfs(M, visited, i-1, j); if(i+1 < n && M[i+1][j] >= M[i][j]) dfs(M, visited, i+1, j); if(j-1 >= 0 && M[i][j-1] >= M[i][j]) dfs(M, visited, i, j-1); if(j+1 < m && M[i][j+1] >= M[i][j]) dfs(M, visited, i, j+1); } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。