【LeetCode417】太平洋大西洋水流问题

简介: (1)找出从太平洋出发的水所能到达的点:

一、题目


image.png


二、思路

(1)找出从太平洋出发的水所能到达的点:

image.png

(2)找出所有从大西洋出发的水能到达的点(从低到高):

image.png

(3)找出1和2的重合点:

image.png

(1)其实满足条件的点中,其从对应的海洋到该点的路线可能是有多条的,但是注意我们只需要找到满足条件的点,而不是找出所有路线。所以可以遍历到当前节点时就用canReach数组进行标记(标记为true,确定遍历过),这种情况就是找到一条路线即可。

(2)ps:一开始两个for循环的边界的col和row写反了,导致heap overflow报错,细心。


三、代码

class Solution {
private:
    vector<pair<int, int>>directions{{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        if(heights.empty() || heights[0].empty()){
            return {};
        }
        int row = heights.size();//row行数
        int col = heights[0].size();//col列数
        vector<vector<int>> ans;
        //太平洋
        vector<vector<bool>> canReachP(row, vector<bool>(col, false));
        //大西洋
        vector<vector<bool>> canReachA(row, vector<bool>(col, false));
        for(int i = 0; i < row; i++){
            //左边太平洋
            dfs(heights, canReachP, i, 0);
            //右边大西洋
            dfs(heights, canReachA, i, col - 1);
        }
        for(int j = 0; j < col; j++){
            //上边太平洋
            dfs(heights, canReachP, 0, j);
            //下边大西洋
            dfs(heights, canReachA, row - 1, j);
        }
        for(int i = 0; i < row; i++){
            for(int j =0; j < col; j++){
                if(canReachP[i][j] && canReachA[i][j]){
                    ans.push_back({i, j});
                }
            }
        }
        return ans;
    }
    void dfs(vector<vector<int>>& heights, vector<vector<bool>>& canReach, int x, int y){
        if(canReach[x][y]){
            return;
        }
        canReach[x][y] = true;
        for(auto dir: directions){
            int newx = x + dir.first, newy = y + dir.second;
            if(canReachfun(heights, x, y, newx, newy)){
                dfs(heights, canReach, newx, newy);
            }
        }    
    }
    bool canReachfun(vector<vector<int>>& heights,int x,int y, int newx, int newy){
        //判断点是否在网格内,且符合题目要求
        if(newx>=0 && newx<heights.size() && 0<=newy && newy<heights[0].size()
           && heights[x][y] <= heights[newx][newy]){
            return true;
        }else{
            return false;
        }
    }
};
相关文章
|
7月前
|
Go
golang力扣leetcode 417.太平洋大西洋水流问题
golang力扣leetcode 417.太平洋大西洋水流问题
52 0
|
7月前
leetcode-417:太平洋大西洋水流问题
leetcode-417:太平洋大西洋水流问题
38 0
LeetCode——417. 太平洋大西洋水流问题
LeetCode——417. 太平洋大西洋水流问题
145 0
LeetCode——417. 太平洋大西洋水流问题
LeetCode每日一题(11)——太平洋大西洋水流问题(递归,深度优先遍历实例)
大西洋太平洋水流问题 1.题目 2.示例 3.思路 理解题目 解题思路 4.代码
151 0
LeetCode每日一题(11)——太平洋大西洋水流问题(递归,深度优先遍历实例)
LeetCode每日一题——417. 太平洋大西洋水流问题
有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。
113 0
LeetCode每日一题——417. 太平洋大西洋水流问题
LeetCode 417. 太平洋大西洋水流问题
LeetCode 417. 太平洋大西洋水流问题
67 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
63 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
128 2