(M)DFS:417. Pacific Atlantic Water Flow

来源:互联网 发布:知乎 暗网体验 编辑:程序博客网 时间:2024/05/22 20:59

这是一个搜索问题。

如果就按照从左上到右下的扫描顺序,那么会有很多很多重复计算,所以这道题采用从边缘开始搜索的方法。分别从边缘开始向内部dfs。

从边缘当作起点开始遍历搜索,然后标记能到达的点位true,分别标记出pacific和atlantic能到达的点,那么最终能返回的点就是二者均为true的点。

class Solution {public:    vector<pair<int, int>> pacificAtlantic(vector<vector<int>>& matrix) {        if (matrix.empty() || matrix[0].empty()) return {};        vector<pair<int, int>> res;        int m = matrix.size(), n = matrix[0].size();        vector<vector<bool>> pacific(m, vector<bool>(n, false));        vector<vector<bool>> atlantic(m, vector<bool>(n, false));        for (int i = 0; i < m; ++i) {            dfs(matrix, pacific, INT_MIN, i, 0);            dfs(matrix, atlantic, INT_MIN, i, n - 1);        }        for (int i = 0; i < n; ++i) {            dfs(matrix, pacific, INT_MIN, 0, i);            dfs(matrix, atlantic, INT_MIN, m - 1, i);        }        for (int i = 0; i < m; ++i) {            for (int j = 0; j < n; ++j) {                if (pacific[i][j] && atlantic[i][j]) {                    res.push_back({i, j});                }            }        }        return res;    }    void dfs(vector<vector<int>>& matrix, vector<vector<bool>>& visited, int pre, int i, int j) {        int m = matrix.size(), n = matrix[0].size();        if (i < 0 || i >= m || j < 0 || j >= n || visited[i][j] || matrix[i][j] < pre) return;        visited[i][j] = true;        dfs(matrix, visited, matrix[i][j], i + 1, j);        dfs(matrix, visited, matrix[i][j], i - 1, j);        dfs(matrix, visited, matrix[i][j], i, j + 1);        dfs(matrix, visited, matrix[i][j], i, j - 1);    }};


原创粉丝点击