ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-01-02 15:02:12  阅读:244  来源: 互联网

标签:边界 matrix int dfs 417 boolean table Leetcode 水流


题目描述

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

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

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

示例:
给定下面的 5x5 矩阵:
在这里插入图片描述
返回:[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上图中带括号的单元)。


思路分析

这道题所给出的二维矩阵,上边界和左边界代表太平洋,下边界和右边界代表大西洋。矩阵中的数字代表高度,水只能从高往低或者等高位上流动,需要我们求出哪些地方的水可以流到两个地方。例如矩阵中的 7,既可以流到太平洋,又可以流到大西洋,我们需要的就是找到这些位置。

我们可以用两个 boolean 类型的二维数组来分别存储水是否可以流到太平洋和大西洋,只要取它们的交集,如果两个二维数组中某个点的值都是 true,那么说明这个点的水既可以流到太平洋,也可以流到大西洋,而这就是我们需要的结果。

如何生成这两个二维数组呢?我们需要从一个点开始,到上下左右,去找比它低或者等于它的值,直到找到太平洋或者大西洋。事实上二维矩阵的边界就连接着海洋,我们可以从边界开始,进行反向操作,去找比它高或者等于它的值,也是可以完成搜索的。

我们可以通过深度优先搜索进行查找,如果相邻的值比当前值低,我们就直接返回,只有比当前值高或者等于当前值,我们才会继续 dfs。


代码描述

使用 Java 进行代码描述:

class Solution {
    public List<List<Integer>> pacificAtlantic(int[][] matrix) {
        List<List<Integer>> result = new ArrayList<>();
        int m = matrix.length;
        if (m == 0) return result;
        int n = matrix[0].length;

        // 定义 table1、table2 存储是否流入太平洋
        boolean[][] table1 = new boolean[m][n];
        boolean[][] table2 = new boolean[m][n];

        // 能否触达上、下
        for (int i = 0; i < n; i++) {
            dfs(matrix, 0, i, matrix[0][i], table1);
            dfs(matrix, m - 1, i, matrix[m - 1][i], table2);
        }

        // 能否触达左右
        for (int i = 0; i < m; i++) {
            dfs(matrix, i, 0, matrix[i][0], table1);
            dfs(matrix, i, n - 1, matrix[i][n - 1], table2);
        }

        // 取出都能触达的点
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (table1[i][j] && table2[i][j]) {
                    List<Integer> list = new ArrayList<>();
                    list.add(i);
                    list.add(j);
                    result.add(list);
                }
            }
        }

        return result;
    }

    public void dfs(int[][] matrix, int x, int y, int pre, boolean[][] table) {
        if (x < 0 || x >= matrix.length || y < 0 || y >= matrix[0].length ||
                matrix[x][y] < pre || // 当前值小于上一个值
                table[x][y] // 当前值已经被标记
        ) return;

        table[x][y] = true;

        // 上下左右
        dfs(matrix, x - 1, y, matrix[x][y], table);
        dfs(matrix, x + 1, y, matrix[x][y], table);
        dfs(matrix, x, y - 1, matrix[x][y], table);
        dfs(matrix, x, y + 1, matrix[x][y], table);
    }
}

欢迎关注

技术公众号:【小猿君的算法笔记】
一起学习,一起成长。


原文链接

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

标签:边界,matrix,int,dfs,417,boolean,table,Leetcode,水流
来源: https://blog.csdn.net/xiaowangku/article/details/111939771

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有