417. 太平洋大西洋水流问题(DFS + BFS + 方向数组)

417. 太平洋大西洋水流问题 本题可以通过深度优先搜索(DFS)或广度优先搜索(BFS)来解决。从太平洋和大西洋的边界开始,分别进行搜索,标记能够到达的单元格,最后找出同时被太平洋和大西洋标记的单元格。的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。 阅读详情

Question

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

在这里插入图片描述

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/random-pick-index/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

Ideas

1、Answer( Java )

解法思路:DFS + 方向数组

⚡️ 方向数组 dirs
//对应上下左右四个方向
static int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

👍 逆向思维 反向搜索 对于一个点它能流动两边的大洋,那么反过来,两边大洋的水反着流就能达到这个点。

  1. 找出所有从太平洋出发的水所能达到的点 canReachP
  2. 找出所有从大西洋出发的水所能达到的点 canReachA
  3. 重合的点即是要找的点

Code①( DFS + 方向数组 )

/**
 * @author Listen 1024
 * @description 417. 太平洋大西洋水流问题(DFS +  BFS + 方向数组)
 * @date 2022-04-27 8:18
 */
class Solution {
    static int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};//the direction array
    int m, n;
    int[][] heights;

    public List<List<Integer>> pacificAtlantic(int[][] heights) {
        ArrayList<List<Integer>> res = new ArrayList<>();
        m = heights.length;
        n = heights[0].length;
        this.heights = heights;
        boolean[][] canReachP = new boolean[m][n], canReachA = new boolean[m][n];
        for (int i = 0; i < m; i++) {
            dfs(canReachP, i, 0);//begin with left boundary
            dfs(canReachA, i, n - 1);//begin with right boundary

        }
        for (int i = 0; i < n; i++) {
            dfs(canReachA, m - 1, i);
            dfs(canReachP, 0, i);

        }

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (canReachA[i][j] && canReachP[i][j]) {
                    res.add(Arrays.asList(i, j));
                }
            }

        }
        return res;
    }

    private void dfs(boolean[][] canReach, int row, int col) {
        if (canReach[row][col]) {
            return;
        }
        canReach[row][col] = true;
        for (int[] dir : dirs) {
            int newRow = row + dir[0], newCol = col + dir[1];
            if (newRow >= 0 && newRow < m && newCol >= 0 && newCol < n && heights[newRow][newCol] >= heights[row][col]) {
                dfs(canReach, newRow, newCol);
            }
        }
    }
}

Code②( DFS ( 方向数组思想 ))

/**
 * @author Listen 1024
 * @description 417. 太平洋大西洋水流问题(DFS +  BFS + 方向数组)
 * @date 2022-04-27 8:18
 */
class Solution {
    public List<List<Integer>> pacificAtlantic(int[][] heights) {
        ArrayList<List<Integer>> res = new ArrayList<>();
        int m = heights.length, n = heights[0].length;
        boolean[][] canReachP = new boolean[m][n], canReachA = new boolean[m][n];
        for (int i = 0; i < m; i++) {
            dfs(heights, canReachP, i, 0);//begin with left boundary
            dfs(heights, canReachA, i, n - 1);//begin with right boundary

        }
        for (int i = 0; i < n; i++) {
            dfs(heights, canReachA, m - 1, i);
            dfs(heights, canReachP, 0, i);

        }

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (canReachA[i][j] && canReachP[i][j]) {
                    res.add(Arrays.asList(i, j));
                }
            }

        }
        return res;
    }

    private void dfs(int[][] heights, boolean[][] canReach, int i, int j) {
        //return when the zone was reached
        if (canReach[i][j]) {
            return;
        }
        //set the current zone true
        canReach[i][j] = true;
        //Up
        if (i - 1 >= 0 && heights[i - 1][j] >= heights[i][j]) {
            dfs(heights, canReach, i - 1, j);
        }
        //Down
        if (i + 1 < heights.length && heights[i + 1][j] >= heights[i][j]) {
            dfs(heights, canReach, i + 1, j);
        }
        //Left
        if (j - 1 >= 0 && heights[i][j - 1] >= heights[i][j]) {
            dfs(heights, canReach, i, j - 1);
        }
        //Right
        if (j + 1 < heights[0].length && heights[i][j + 1] >= heights[i][j]) {
            dfs(heights, canReach, i, j + 1);
        }
    }
}

2、Answer( Java )

解法思路:BFS + 方向数组

Code(BFS + 方向数组 )

/**
 * @author Listen 1024
 * @description 417. 太平洋大西洋水流问题(DFS +  BFS + 方向数组)
 * @date 2022-04-27 8:18
 */
 class Solution {
    static int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};//the direction array
    int m, n;
    int[][] heights;

    public List<List<Integer>> pacificAtlantic(int[][] heights) {
        ArrayList<List<Integer>> res = new ArrayList<>();
        m = heights.length;
        n = heights[0].length;
        this.heights = heights;
        boolean[][] canReachP = new boolean[m][n], canReachA = new boolean[m][n];
        for (int i = 0; i < m; i++) {
            bfs(canReachP, i, 0);//begin with left boundary
            bfs(canReachA, i, n - 1);//begin with right boundary

        }
        for (int i = 0; i < n; i++) {
            bfs(canReachA, m - 1, i);
            bfs(canReachP, 0, i);

        }

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (canReachA[i][j] && canReachP[i][j]) {
                    res.add(Arrays.asList(i, j));
                }
            }

        }
        return res;
    }

    private void bfs(boolean[][] canReach, int row, int col) {
        if (canReach[row][col]) {
            return;
        }
        canReach[row][col] = true;
        Queue<int[]> queue = new ArrayDeque<>();
        queue.offer(new int[]{row, col});
        while (!queue.isEmpty()) {
            int[] cell = queue.poll();
            for (int[] dir : dirs) {
                int newRow = cell[0] + dir[0], newCol = cell[1] + dir[1];
                if (newRow >= 0 && newRow < m && newCol >= 0 && newCol < n && heights[newRow][newCol] >= heights[cell[0]][cell[1]] && !canReach[newRow][newCol]) {
                    canReach[newRow][newCol] = true;
                    queue.offer(new int[]{newRow, newCol});
                }
            }

        }

    }
}
//题解参考链接(如侵删)
https://leetcode.cn/problems/pacific-atlantic-water-flow/solution/tai-ping-yang-da-xi-yang-shui-liu-wen-ti-sjk3/
https://leetcode.cn/problems/pacific-atlantic-water-flow/solution/shui-wang-gao-chu-liu-by-xiaohu9527-xxsx/
leetcode 417. 太平洋大西洋水流问题 https://leetcode-cn.com/problems/pacific-atlantic-water-flow/ 思路是从海洋开始逆流 如果可以逆流到 就标记为1 然后检查两个海洋都可以逆流到的区域 DFS public List<List<Integer>> pacificAtlantic(int[][] matrix) { if (matrix.length == 0 || matrix[0].length == 0) { 阅读详情

相关推荐

【QGIS】PyCharm集成pyqgis的processing工具箱:环境配置与初始化实战

本文详细介绍了如何在PyCharm中配置QGIS的Python环境并成功集成其强大的Processing工具箱。文章核心解决了独立环境下导入processing模块失败、算法无法调用等常见难题,通过手动添加插件路径和执行关键初始化步骤,实现了在PyCharm中丝滑调用QGIS地理处理算法,从而将复杂的空间分析流程自动化。

weixin_28831399的博客 391

20210717方向数组和深度优先遍历(dfs搜索矩阵)

剑指 Offer 13. 机器人的运动范围 输入:m = 2, n = 3, k = 1 输出:3 输出结果为可以到达的格子的数目。 1.boolean数组 用一个数组标记是不是搜索过 package com.leetcode.demo; public class BooleanVex { public static void main(String[] args) { boolean[][] vex =new boolean[5][5]; System.out.println(v

sunnygao的博客 346

带隙基准源要点

要点: 负反馈>正反馈;电流镜匹配;双极型晶体管匹配;电阻匹配; 经过R0的电流????????????=????????????????−????????????????????????=∆????????????????????i_R0=(〖VBE〗_1-〖VBE〗_2)/R_0 =∆VBE/R_0 经过R1的电流????????????=i_R1= ????????????????????VBE/R_1 零温电流I = ∆????????????????????∆VBE/R_0 +

HI_WALLE的博客 2264

【算法学习】搜索算法(方向数组、dfs搜索)

搜索算法1.方向数组的搜索(欧拉11题)题目描述题目分析 1.方向数组的搜索(欧拉11题) 题目描述 方阵中的最大乘积 在如下的20×20方阵中,有四个呈对角线排列的数被加粗了。 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04...

moX980的博客 2360

BRAM在图像处理缓存中的实现:完整示例解析

深入讲解如何利用BRAM高效实现图像处理中的数据缓存,结合实际案例解析BRAM的应用优势与设计细节,提升系统性能。

weixin_29443363的博客 333

MinerU安装指南:从源码到验证的完整流程

本文详细介绍了MinerU文档转换工具的安装流程,从源码获取、依赖安装到验证步骤,提供了完整的安装指南和常见问题解决方案。特别适合技术写作者和开发者快速部署这款高效的文档转换工具,提升工作效率。

weixin_29243279的博客 544

java数组

数组的定义:相同类型数据的有序集合 组的长度:[0, n-1] 数组的声明与创建 //声明 int[] num1; //首选方法 int num2[]; //效果相同,但不是首选方法 //创建 int[] numbers = new int[10]; //一定要分配内存大小 package com.lockcore.day02; public class ArrayDemo { public static void main(String[] args) { //静态初始.

代码是世界上最美丽的语言 216

DeepSeek网页版和DeepSeek Harness

DeepSeek网页版是开箱即用的对话工具,适合快速问答与日常任务;而DeepSeekHarness(dsh)是基于Node.js的开源智能体框架,支持文件操作、命令执行、多工具协同,实现“对话即执行”。二者定位不同:网页版为“大脑”,Harness为“躯体”。前者封闭易用,后者开放可扩展,具备可追溯的执行日志与插件化架构。未来,网页版将聚焦轻量化普及,Harness则致力于构建生态平台。对开发者而言,应将AI作为执行层,守住决策层,深耕垂直领域,并掌握AI工作流设计能力,以构建不可替代的技术优势。

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 898

LeetCode 417. 太平洋大西洋水流问题(BFS/DFS)

文章目录1. 题目2. 解题2.1 BFS 广度优先搜索2.2 DFS 深度优先搜索 1. 题目 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。 “太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。 规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。 请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。 提示: 输出坐标的顺序不重要 m 和 n 都小于150 示例: 给定下面的 5x5 矩阵: 太平

Michael是个半路程序员 1816

第78章:PCL Multiple View ICP 多视角配准

多视角配准(Multiple View ICP)是迭代最近点(ICP)算法的扩展,旨在处理多视角的点云数据配准问题。传统的ICP算法主要用于两幅点云之间的配准,而多视角配准则处理来自多个视角或不同时间采集的多个点云数据的配准任务。在实际应用中,多个传感器或多个拍摄角度获得的点云数据常常需要进行联合配准。这些点云可能由于不同的视角、拍摄位置或时间差异而存在位置和旋转的差异。多视角配准的目标是根据多个点云之间的匹配关系,找到它们的相对变换,使得这些点云能够合并成一个统一的三维模型。

yumeiguo的博客 158

Python爬取公交线路信息及站点shp数据 文末附数据下载地址

三、现在已经获取到了各个线路名称、链接,以及所途径的上下行站点,那么接下来就应该对开始对第三页url进行信息采集,即本次爬虫的最终目的:爬取所有站点的GPS坐标数据。但坑就坑在,二环一号线属于环线,所以只有左侧有站点数据,而其他非环线车次的站点数据分有上下行,如果用正则匹配,则分不清楚到底哪些是上行站点哪些是下行站点。以前爬过百度地图,当时用的是API平台,加上网站比较规范,所以标签节点什么的都比较清晰,但这次由于特殊原因所选择的网站为公交网,废话不多说直接开始吧。checi=二环一号线。

J_Giser的博客 1316

从海洋逆向探索:417. 太平洋大西洋水流问题深度解析

解决「太平洋大西洋水流问题」的关键在于逆向思维,利用水流的可逆性将「判断单元格流向海洋」转化为「判断海洋能否反向到达单元格」,从而将时间复杂度从 O ((mn)²) 优化为 O (mn)。反向标记:从两大洋边界出发,用 DFS/BFS 标记各自的可达区域。求交集:两个可达区域的重叠部分即为答案。这种「逆向遍历 + 边界出发」的思路,在处理「可达性问题」(尤其是边界明确的场景)时具有广泛应用,例如「岛屿问题」「水流问题」等,可大幅提升算法效率。

qq_34434522的博客 1442

在isaacsim仿真系统进行遥操作(设备是quest3):怎么让遥操作设备(quest3)在Isaac sim系统中控制机械臂并把其中的参数传输出来??

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

**My Coding Family** 942

【FloodFill】太平洋大西洋水流问题

Flood Fill算法通常有两种实现方法:下面是一个简单的Flood Fill算法示例,使用了深度优先搜索(DFS)来实现: 这段代码定义了一个方法,接受一个二维字符数组表示图像,以及两个坐标和作为起始点,还有需要替换的旧颜色和新颜色。通过递归的方式,它会把从起始点开始的所有连续的都替换成。 题⽬链接:417. 太平洋大西洋水流问题 - 力扣(LeetCode) 总结 这个用了一个正难则反的思想,在很多算法题中都会用到这个技巧,好好学,好好练,感谢阅览!

Y_1215的博客 1159

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

417. 太平洋大西洋水流问题(中等)题解

417. 太平洋大西洋水流问题(中等)题解

ZeroBugX的博客 916

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

LeetCode 417 - 太平洋大西洋水流问题

这道题看起来像地理模拟,但其实是个非常典型的「图搜索 + 反向思考」问题。 我们要找出能同时流向太平洋(左上边界)和大西洋(右下边界)的所有坐标点。 题目乍看复杂,其实核心思路只有一句话:从海洋反向出发,找出能到达的点。

记录从移动端、鸿蒙到物联网与AI的完整实战与思考。专注于分享可复用的工程方案与产品思维,尤其深入鸿蒙生态与全栈开发。以十年工程与管理沉淀,为你提供清晰的技术纵深路径。坚信技术的价值在于“贯通”与“落地”。 771

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

图论part3|101.孤岛的总面积、沉没孤岛、417. 太平洋大西洋水流问题

是否有挨着边的岛屿所以可以先遍历四条边挨着的岛屿,把他们标记为非孤岛。

m0_62572567的博客 1039

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

[JavaScript 刷题] 数组 - 重排字符形成目标字符串,leetcode 2287 github repo 地址: https://github.com/GoldenaArcher/js_leetcode,Github 的目录 大概 会更新的更勤快一些。 题目地址:2287. Rearrange Characters to Make Target String 题目 如下: You are given two 0-indexed strings s and target. You can tak

GoldenaArcher的博客 446

Leetcode(417)——太平洋大西洋水流问题

Leetcode(417)——太平洋大西洋水流问题

KCDCY的博客 425

力扣解题思路:417. 太平洋大西洋水流问题

417. 太平洋大西洋水流问题 思路:题目: 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 * * *

qq_39879315的博客 213

​LeetCode刷题实战417:太平洋大西洋水流问题

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !...

程序IT圈 331

太平洋大西洋水流问题如何解决?一文了解图在前端中的应用

一文了解图在前端中的应用序言一、图是什么?1、定义2、举例二、图的表示法1、邻接矩阵表示法2、邻接表表示法三、图的常用操作1、图的深度优先遍历(1)定义(2)口诀(3)代码实现2、图的广度优先遍历(1)定义(2)口诀(3)代码实现四、leetcode经典题目解析1、leetcode417太平洋大西洋水流问题(中等)2、leetcode133克隆图(中等)3、leetcode65有效数字(困难)五、结束语彩蛋时间Painted Eggshell往期推荐番

moandaylab 610

417. 太平洋大西洋水流问题(DFS)

417. 太平洋大西洋水流问题题目解题思路代码 题目 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。 规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。 请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。 提示: 输出坐标的顺序不重要 m 和 n 都小于150 解题思路 这题和130题有点类似,都是从边界往内寻找。 这题呢我们从边界出发,假设先从上边

Hello World 724

图论专题(十四):“双重边界”的交汇——逆流而上解「太平洋大西洋水流问题」

今天这道题,是对“边界逆向思维”的完美升华。LC 130 (被围绕的区域):我们需要区分“是”与“否”(是否连接边界)。我们只需要一次边界扩散。LC 417 (本题):我们需要区分“A”与“B”(连接哪个边界)。我们进行了两次边界扩散,然后求交集。这种**“分解问题 -> 分别求解 -> 组合结果”的策略,配合“从结果(海洋)推导原因(陆地)”**的逆向思维,是解决复杂连通性问题的高阶技巧。在下一篇中,我们将面对“网格BFS”的终极 Boss ——带状态的 BFS。

2301_80334067的博客 1083

代码随想录算法训练营Day 63| 图论 part03 | 417.太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙

用两个visited来表示。

m0_51759998的博客 1967
上一篇: 883. 三维形体投影面积( 数组行列最大值 )
下一篇: 908. 最小差值 I( 数学规律 + 数组求最值 )( Java8新特性 StreamAPI )
Listen 1024
博客等级 码龄6年 24粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值