Pacific Atlantic Water Flow 太平洋大西洋水流問題
阿新 • • 發佈:2018-12-10
給定一個 m x n
的非負整數矩陣來表示一片大陸上各個單元格的高度。“太平洋”處於大陸的左邊界和上邊界,而“大西洋”處於大陸的右邊界和下邊界。
規定水流只能按照上、下、左、右四個方向流動,且只能從高到低或者在同等高度上流動。
請找出那些水流既可以流動到“太平洋”,又能流動到“大西洋”的陸地單元的座標。
提示:
- 輸出座標的順序不重要
- m 和 n 都小於150
示例:
給定下面的 5x5 矩陣: 太平洋 ~ ~ ~ ~ ~ ~ 1 2 2 3 (5) * ~ 3 2 3 (4) (4) * ~ 2 4 (5) 3 1 * ~ (6) (7) 1 4 5 * ~ (5) 1 1 2 4 * * * * * * 大西洋 返回: [[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上圖中帶括號的單元).
思路:可以採用兩步法,先找到能流到太平洋的大陸,即從左和上邊開始搜尋,如果下一個節點(左上右下)比當前節點高或相等,水就能流過去,把對應的二維陣列標註為true,同理對大西洋即右下邊做相同的操作,對另一個二維陣列可以流進大西洋的節點標註true,最後對應位置兩個二維陣列都標註為true的地方就是既能流進太平洋也能流進大西洋的地方。
參考程式碼:
class Solution { public: void dfs(vector<vector<bool>> &visit, vector<vector<int>>& matrix, int r, int c) { visit[r][c] = true; if ((r - 1) >= 0 && !visit[r-1][c] && matrix[r - 1][c] >= matrix[r][c]) dfs(visit, matrix, r - 1, c); if ((r + 1) < matrix.size() && !visit[r + 1][c] && matrix[r + 1][c] >= matrix[r][c]) dfs(visit, matrix, r + 1, c); if ((c - 1) >= 0 && !visit[r][c-1] && matrix[r][c - 1] >= matrix[r][c]) dfs(visit, matrix, r, c - 1); if ((c + 1) < matrix[0].size() && !visit[r][c+1] && matrix[r][c + 1] >= matrix[r][c]) dfs(visit, matrix, r, c + 1); } vector<pair<int, int>> pacificAtlantic(vector<vector<int>>& matrix) { vector<pair<int, int>> res; if (matrix.empty()) return res; int m = matrix.size(), n = matrix[0].size(); vector<vector<bool>> visit_pacific(matrix.size(), vector<bool>(matrix[0].size(), false)); vector<vector<bool>> visit_atlantic(matrix.size(), vector<bool>(matrix[0].size(), false)); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (i == 0 || j == 0) visit_pacific[i][j] = true; if (i == (m - 1) || j == (n - 1)) visit_atlantic[i][j] = true; } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (i == 0 || j == 0) dfs(visit_pacific, matrix, i, j); if (i == (m - 1) || j == (n - 1)) dfs(visit_atlantic, matrix, i, j); } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (visit_atlantic[i][j] && visit_pacific[i][j]) res.push_back(make_pair(i, j)); } } return res; } };