LeetCode 第417题:太平洋大西洋水流问题

1、前言

这个问题的意思是,二维数组的一个坐标,既可以流到“太平洋”,又可以流到“大西洋”。

2、思路

从海洋开始逆流 如果可以逆流到 就标记为1 然后检查两个海洋都可以逆流到的区域

3、代码

class Solution {
    public List> pacificAtlantic(int[][] matrix) {
        if(matrix.length == 0 || matrix[0].length == 0){
            return new ArrayList<>();
        }

        int m = matrix.length;
        int n = matrix[0].length;

        int[][] pecific = new int[m][n];
        int[][] atlantic = new int[m][n];

        // 从海洋边界开始
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                // 从太平洋边界流动
                if(i == 0 || j == 0){
                    dfs(matrix, pecific, i, j, matrix[i][j]);
                }
                // 从大西洋边界流动
                if(i == m -1 || j == n - 1){
                    dfs(matrix, atlantic, i, j, matrix[i][j]);
                }
            }
        }

        List> res = new ArrayList<>();

        // 都能到达的区域
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(pecific[i][j] == 1 && atlantic[i][j] == 1){
                    res.add(Arrays.asList(i, j));
                }
            }
        }

        return res;
    }

    private void dfs(int[][] matrix, int[][] aux, int i, int j, int pre){
        // 判断边界
        if(i < 0 || j < 0 || i >= matrix.length || j >= matrix[0].length
                    // 已经流到过了
                    || aux[i][j] == 1
                    // 不能流动
                    || matrix[i][j] < pre){
            return;
        }

        aux[i][j] = 1;
        dfs(matrix, aux, i - 1, j, matrix[i][j]);
        dfs(matrix, aux, i + 1, j, matrix[i][j]);
        dfs(matrix, aux, i, j - 1, matrix[i][j]);
        dfs(matrix, aux, i, j + 1, matrix[i][j]);
    }
}

你可能感兴趣的:(LeetCode 第417题:太平洋大西洋水流问题)