【三次过】Lintcode 778. 太平洋和大西洋的水流

39 篇文章 1 订阅
22 篇文章 0 订阅

给定一个m×n的非负矩阵代表一个大洲,矩阵的每个单元格的值代表此处的地形高度,矩阵的左边缘和上边缘是“太平洋”,下边缘和右边缘是“大西洋”。

水流只能在四个方向(上,下,左或右)从一个单元格流向另一个海拔和自己相等或比自己低的单元格。

找到那些从此处出发的水既可以流到“太平洋”,又可以流向“大西洋”的单元格的坐标。

样例

例1:

输入:
matrix = 
[[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]]
输出:
[[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]]
解释:
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

例2:

输入:
matrix =
[[1,2],
[4,3]]
输出:
[[0,1],[1,0],[1,1]]

注意事项

1.返回的满足条件的坐标的任意一种排列即可。
2.'n,m<=150'。


解题思路:

从四周往内部dfs,最后判断哪些点两个大洋都可达。

public class Solution {
    /**
     * @param matrix: the given matrix
     * @return: The list of grid coordinates
     */
    public List<List<Integer>> pacificAtlantic(int[][] matrix) {
        // write your code here
        List<List<Integer>> res = new ArrayList<>();
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
            return res;
        }
        row = matrix.length;
        col = matrix[0].length;
        boolean[][]Pacific = new boolean[row][col];
        boolean[][]Atlantic = new boolean[row][col];
        
        //从四周开始深搜
        for(int i = 0;i < row;i++){
            dfs(matrix, Pacific, Integer.MIN_VALUE, i, 0);
            dfs(matrix, Atlantic, Integer.MIN_VALUE, i, col - 1);
        }
        for(int i = 0;i < col;i++){
            dfs(matrix, Pacific, Integer.MIN_VALUE, 0, i);
            dfs(matrix, Atlantic, Integer.MIN_VALUE, row - 1, i);
        }
        
        //求两者交集,即为结果
        for(int i = 0;i < row;i++){
            for(int j = 0;j < col;j++){
                if(Pacific[i][j] && Atlantic[i][j]){
                    List<Integer> temp = new ArrayList<>();
                    temp.add(i);
                    temp.add(j);
                    res.add(temp);
                }
            }
        }
        return res;
    }
    
    int row;
    int col;
    int[][] p = {{0,1},{0,-1},{1,0},{-1,0}};
    
    public void dfs(int[][] matrix, boolean[][] visited, int height, int x, int y){

        if(x < 0 || x >=row || y < 0 || y >= col || matrix[x][y] < height || visited[x][y]){
            return;
        }
        visited[x][y] = true;
        for(int i = 0;i < 4;i++){
            dfs(matrix, visited, matrix[x][y], x + p[i][0], y + p[i][1]);
        }
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值