Pacific Atlantic Water Flow

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值