• Leetcode 417.太平洋大西洋水流问题


    太平洋大西洋水流问题

    给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。"太平洋"处于大陆的左边界和上边界,而"大西洋"处于大陆的右边界和下边界。

    规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。

    请找出那些水流既可以流动到"太平洋",又能流动到"大西洋"的陆地单元的坐标。

       

    提示:

    1. 输出坐标的顺序不重要
    2. mn 都小于150

       

    示例:

       

    给定下面的 5x5 矩阵:

     

    返回:

    [[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上图中带括号的单元).

    题解

    • 做法:dfs+记忆化搜索
    • 分两部分处理,第一个dfs处理能否到达太平洋,第二个dfs处理能否到达大西洋,我用path记录走过的路径,若为true
      则可以到达,若为false则不可到达。(对每个点进行上下左右搜索)

     

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 class Solution {
     5     public boolean[][] vis;
     6     public boolean[][] vis1;
     7     public int n,m;
     8     public List<int[]> pacificAtlantic(int[][] matrix) {
     9         if(matrix.length==0||matrix[0].length==0){
    10             return new ArrayList<int[]>();
    11         }
    12         n=matrix.length;
    13         m=matrix[0].length;
    14         boolean[][] path=new boolean[n][m];
    15         boolean[][] path1=new boolean[n][m];
    16         vis=new boolean[n][m];
    17         vis1=new boolean[n][m];
    18         List<int[]> ans=new ArrayList<int[]>();
    19         for(int i = 0; i<n; ++i){
    20             for(int j = 0; j<m; ++j){
    21                 if(dfs(i,j,path,matrix,matrix[i][j])&&dfs1(i,j,path1,matrix,matrix[i][j])){
    22                     ans.add(new int[]{i,j});
    23                 }
    24             }
    25         }
    26         return ans;
    27     }
    28     public boolean dfs(int x, int y, boolean[][] path, int[][] matrix, int pre){
    29         if(x>=n||y>=m){
    30             return false;
    31         }
    32         if(x<0||y<0){
    33             return true;
    34         }
    35         if(matrix[x][y]>pre){
    36             return false;
    37         }
    38         if(vis[x][y]){
    39             return path[x][y];
    40         }
    41         vis[x][y]=true;
    42         path[x][y]=dfs(x-1,y,path,matrix,matrix[x][y])||dfs(x,y-1,path,matrix,matrix[x][y]) ||dfs(x+1,y,path,matrix,matrix[x][y])||dfs(x,y+1,path,matrix,matrix[x][y]);
    43         vis[x][y]=false;
    44         return path[x][y];
    45     }
    46     public boolean dfs1(int x,int y,boolean[][] path,int[][] matrix,int pre){
    47         if(x<0||y<0){
    48             return false;
    49         }
    50         if(x>=n||y>=m){
    51             return true;
    52         }
    53         if(matrix[x][y]>pre){
    54             return false;
    55         }
    56         if(vis1[x][y]){
    57             return path[x][y];
    58         }
    59         vis1[x][y]=true;
    60         path[x][y]=dfs1(x-1,y,path,matrix,matrix[x][y])||dfs1(x,y-1,path,matrix,matrix[x][y]) ||dfs1(x+1,y,path,matrix,matrix[x][y])||dfs1(x,y+1,path,matrix,matrix[x][y]);
    61         vis1[x][y]=false;
    62         return path[x][y];
    63     }
    64 }
  • 相关阅读:
    数据库自增ID归零
    JAVA中的接口和抽象类(转)
    谈如何学习linux (转)
    如何编译安装源码包软件(转)
    每天对着电脑46小时的人必看
    JAVA错误处理大集合
    5月15号项目总结
    让程序在Windows CE系统启动时自动运行
    wince.net4.2问题
    触摸屏定位校准
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10242211.html
Copyright © 2020-2023  润新知