Pacific Atlantic Water Flow

↘锁芯ラ 提交于 2019-12-18 07:37:26

1. 解析

 题目大意,找出能同时流向太平洋和印度洋的区域,太平洋区域为左边和上边,印度洋区域为右边和下边。只有当前区域高度大于或等于相邻区域高度才能流向该区域

2. 分析

刚开始看到这题,我第一反映就是Surrounded Regions,但这里最大的不同在于有两个区域,而不是仅仅只有一个区域,最初我以为要设计两个递归函数,一个检测是否能流向太平洋,另外一个检测是否能流向印度洋,但感觉不是很合理。参考@Grandyang博主的思路,感觉他的解法也很巧妙。实际上无需设计两个递归,我们只需从边缘向中间检测即可,然后分别用两个不同的数组分别表示流向太平洋和印度洋的点,最后根据这两个数组即可判断是否能同时流向太平洋和印度洋。思路和Surrounded Regions差不多,只需利用两个数组存储两种不同状态即可。

class Solution {
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix){
        if (matrix.empty() || matrix[0].empty()) return {};
        
        int m = matrix.size(), n = matrix[0].size();
        vector<vector<bool>> atlantic(m, vector<bool>(n, false));
        vector<vector<bool>> pacific(m, vector<bool>(n, false));
        vector<vector<int>> res;
        
        for (int row = 0; row < m; ++row){ //从 左/右 边缘开始检测
            DFS(matrix, row, 0, INT_MIN, atlantic);
            DFS(matrix, row, n-1, INT_MIN, pacific);
        }
        for (int col = 0; col < n; ++col){ //从 上/下 边缘开始检测
            DFS(matrix, 0, col, INT_MIN, atlantic);
            DFS(matrix, m-1, col, INT_MIN, pacific);
        }
        for (int row = 0; row < m; ++row){
            for (int col = 0; col < n; ++col){
                if (atlantic[row][col] && pacific[row][col])
                    res.push_back({row, col});
            }
        }
        
        return res;
    }
    
    void DFS(vector<vector<int>>& matrix, int row, int col, int pre, vector<vector<bool>>& visited){
        int m = matrix.size(), n = matrix[0].size();
        if (row < 0 || col >= n || row >= m || col < 0 || visited[row][col] || matrix[row][col] < pre) 
            return;
        visited[row][col] = true;
        DFS(matrix, row-1, col, matrix[row][col], visited); //上
        DFS(matrix, row, col+1, matrix[row][col], visited); //右
        DFS(matrix, row+1, col, matrix[row][col], visited); //下
        DFS(matrix, row, col-1, matrix[row][col], visited); //左
    }
};

3. 类似的题目

Surrounded Regions

Number of Islands 

 [1]https://www.cnblogs.com/grandyang/p/5962508.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!