深度/广度优先搜索LeetCode 417 Pacific Atlantic Water Flow

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;
    }
};

猜你喜欢

转载自blog.csdn.net/shey666/article/details/80783543