LeetCode 417
Pacific Atlantic Water Flow
- Problem Description:
题目给出一个矩阵,矩阵的左侧和上侧为太平洋区域,矩阵的右侧和下侧为大西洋区域,矩阵中每个元素值代表水的高度,水只能向不比它高的地方流动。题目要求矩阵中哪些位置的水既可以流向太平洋也能流向大西洋。
具体的题目信息:
https://leetcode.com/problems/pacific-atlantic-water-flow/description/ - Example:

- Solution:
- 解题思路:分别从大西洋和太平洋区域出发,向水流方向递增的流动,流经的位置取交集即可。
(1)申明与矩阵相同大小的bool数组分别存储从太平洋和大西洋出发流经的位置,初始化为false。
(2)申明一个队列,分别将太平洋和大西洋区域的元素位置push进去,并将相应位置的bool值更新为true
(3)对于队列中的每个位置进行以下操作:获取队首元素,遍历其四周看周围元素是否比当前元素值大(或者相等)且未被访问过,如果是则把周围元素push进队列并更新其bool值,否则不做处理。重复以上操作直至队列为空。
(4)对两个bool数组取交集,将相同位置push进最终的vector数组即可。 - 编程实现:
class Solution {
public:
vector<pair<int, int>> pacificAtlantic(vector<vector<int>>& matrix) {
vector<pair<int, int>> res;
if (matrix.size() == 0) return res;
vector<vector<bool>> P(matrix.size(), vector<bool>(matrix[0].size(), false));
vector<vector<bool>> A(matrix.size(), vector<bool>(matrix[0].size(), false));
queue<pair<int, int>> Q;
for (int j = 0; j < matrix[0].size(); j++) {
Q.push({0, j});
P[0][j] = true;
}
for (int i = 0; i < matrix.size(); i++) {
Q.push({i, 0});
P[i][0] = true;
}
while(!Q.empty()) {
pair<int, int> temp = Q.front();
Q.pop();
PP(P, temp.first, temp.second, matrix, Q);
}
for (int j = 0; j < matrix[0].size(); j++) {
Q.push({matrix.size()-1, j});
A[matrix.size()-1][j] = true;
}
for (int i = 0; i < matrix.size(); i++) {
Q.push({i, matrix[0].size()-1});
A[i][matrix[0].size()-1] = true;
}
while(!Q.empty()) {
pair<int, int> temp = Q.front();
Q.pop();
PP(A, temp.first, temp.second, matrix, Q);
}
for (int i = 0; i < P.size(); i++) {
for (int j = 0; j < P[0].size(); j++) {
if (A[i][j]&&P[i][j])
res.push_back({i, j});
}
}
return res;
}
void PP(vector<vector<bool>>& P, int i, int j, vector<vector<int>>& matrix, queue<pair<int, int>>& Q) {
if (i+1 >= 0 && i+1 < matrix.size() && j >= 0 && j < matrix[0].size() && matrix[i+1][j]>=matrix[i][j] && P[i+1][j] == false) {
P[i+1][j] = true;
Q.push({i+1, j});
PP(P, i+1, j, matrix, Q);
}
if (i-1 >= 0 && i-1 < matrix.size() && j >= 0 && j < matrix[0].size() && matrix[i-1][j]>=matrix[i][j] && P[i-1][j] == false) {
P[i-1][j] = true;
Q.push({i-1, j});
PP(P, i-1, j, matrix, Q);
}
if (i >= 0 && i < matrix.size() && j+1 >= 0 && j+1 < matrix[0].size() && matrix[i][j+1]>=matrix[i][j] && P[i][j+1] == false) {
P[i][j+1] = true;
Q.push({i, j+1});
PP(P, i, j+1, matrix, Q);
}
if (i >= 0 && i < matrix.size() && j-1 >= 0 && j-1 < matrix[0].size() && matrix[i][j-1]>=matrix[i][j] && P[i][j-1] == false) {
P[i][j-1] = true;
Q.push({i, j-1});
PP(P, i, j-1, matrix, Q);
}
return;
}
};