搜索(DFS)---能到达的太平洋和大西洋的区域

Posted yjxyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索(DFS)---能到达的太平洋和大西洋的区域相关的知识,希望对你有一定的参考价值。

能到达的太平洋和大西洋的区域

417. Pacific Atlantic Water Flow (Medium)

Given the following 5x5 matrix:

  Pacific ~   ~   ~   ~   ~
       ~  1   2   2   3  (5) *
       ~  3   2   3  (4) (4) *
       ~  2   4  (5)  3   1  *
       ~ (6) (7)  1   4   5  *
       ~ (5)  1   1   2   4  *
          *   *   *   *   * Atlantic

Return:
[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (positions with parentheses in above matrix).

题目描述:

??左边和上边是太平洋,右边和下边是大西洋,内部的数字代表海拔,海拔高的地方的水能够流到低的地方,求解水能够流到太平洋和大西洋的所有位置。

思路分析:

??从边界出发,左边界和上边界元素都可以流进太平洋,右边界和下边界元素都可以流进大西洋,我们遍历边界元素,然后对边界元素进行深度优先遍历,如果在深度优先遍历的过程中遇到的元素值,大于边界元素,那么证明其可以流入对应的海洋,然后继续对该元素进行深度优先遍历,直到遇见的元素都比其小从而停止遍历。最后我们查看数组中的元素,如果既能到达太平洋又能到达大西洋,那么这个元素就是满足要求得结果,返回其坐标。

代码:

public List<int[]>pacificAtlantic(int[][]matrix)
    List<int []>res=new ArrayList<>();
    if(matrix==null||matrix.length==0)
        return res;
    boolean[][]canReachp=new boolean[matrix.length][matrix[0].length]; //记录某个节点是否能到太平洋
    boolean[][]canReacha=new boolean[matrix.length][matrix[0].length];//记录某个节点是否能到达大西洋
    for(int i=0;i<matrix.length;i++)
        dfs(matrix,i,0,canReachp);//从左边界开始深搜看是否元素能到达太平洋
        dfs(matrix,i,matrix[0].length-1,canReacha); //从右边界开始深搜看是否元素能到达大西洋
    
    for(int j=0;j<matrix[0].length;j++)
        dfs(matrix,0,j,canReachp);//从上边界开始深搜看元素是否能到达太平洋
        dfs(matrix,matrix.length-1,j,canReacha); //从下边界开始深搜看元素是否能到到达大西洋
    
    for(int i=0;i<matrix.length;i++)
        for(int j=0;j<matrix[0].length;j++)
            if(canReachp[i][j]&&canReacha[i][j])//既能到达大西洋又能到达太平洋
                res.add(new int[]i,j);
            
        
    
    return res;

public void dfs(int[][]matrix,int i,int j,boolean[][]canReach)
    if(canReach[i][j]) //避免重复
        return;
    canReach[i][j]=true;
    if(i+1<matrix.length&&matrix[i][j]<=matrix[i+1][j])
        dfs(matrix,i+1,j,canReach);
    if(i-1>=0&&matrix[i][j]<=matrix[i-1][j])
        dfs(matrix,i-1,j,canReach);
    if(j+1<matrix[0].length&&matrix[i][j]<=matrix[i][j+1])
        dfs(matrix,i,j+1,canReach);
    if(j-1>=0&&matrix[i][j]<=matrix[i][j-1])
        dfs(matrix,i,j-1,canReach);
  

以上是关于搜索(DFS)---能到达的太平洋和大西洋的区域的主要内容,如果未能解决你的问题,请参考以下文章

利用DFS解决太平洋大西洋水流问题

利用DFS解决太平洋大西洋水流问题

利用DFS解决太平洋大西洋水流问题

LeetCode 417. 太平洋大西洋水流问题(多源bfs) / 905. 按奇偶排序数组 / 427. 建立四叉树(dfs+二维前缀和)

LeetCode 417 太平洋大西洋水流问题[DFS] HERODING的LeetCode之路

[JavaScript 刷题] 搜索 - 太平洋大西洋水流问题, leetcode 417