1. 程式人生 > >Pacific Atlantic Water Flow 太平洋大西洋水流問題

Pacific Atlantic Water Flow 太平洋大西洋水流問題

給定一個 m x n 的非負整數矩陣來表示一片大陸上各個單元格的高度。“太平洋”處於大陸的左邊界和上邊界,而“大西洋”處於大陸的右邊界和下邊界。

規定水流只能按照上、下、左、右四個方向流動,且只能從高到低或者在同等高度上流動。

請找出那些水流既可以流動到“太平洋”,又能流動到“大西洋”的陸地單元的座標。

提示:

  1. 輸出座標的順序不重要
  2. 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;
}
};