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

417. 太平洋大西洋水流问题 这道题目是经典的图搜索与动态流动模拟问题。从海洋出发而不是从陆地出发;利用了反向搜索、布尔矩阵等技巧;在面试中考察候选人的图算法功底、建模能力和代码鲁棒性。如果你理解了这道题,就掌握了很多题型的通用解法,比如“流动、连通、填充”等问题。 阅读详情

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

今天和大家聊的问题叫做 太平洋大西洋水流问题,我们先来看题面:

https://leetcode-cn.com/problems/pacific-atlantic-water-flow/

There is an m x n rectangular island that borders both the Pacific Ocean and Atlantic Ocean. The Pacific Ocean touches the island's left and top edges, and the Atlantic Ocean touches the island's right and bottom edges.

The island is partitioned into a grid of square cells. You are given an m x n integer matrix heights where heights[r][c] represents the height above sea level of the cell at coordinate (r, c).

The island receives a lot of rain, and the rain water can flow to neighboring cells directly north, south, east, and west if the neighboring cell's height is less than or equal to the current cell's height. Water can flow from any cell adjacent to an ocean into the ocean.

Return a 2D list of grid coordinates result where result[i] = [ri, ci] denotes that rain water can flow from cell (ri, ci) to both the Pacific and Atlantic oceans.

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

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

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

示例

bad23be33b08a9e1d0a5f35991433909.png

解题

可以用DFS和BFS,这里用DFS

首先,我们要找的既能流进太平洋,又能流进大西洋的,所以,我们分开讨论,找可以流进太平洋的坐标,再找大西洋的坐标.

其次,我们不需要一个一个坐标判断,我们只要考虑边界就行,我拿上边界为例,上边界都可以流入太平洋,所以我们可以从上边界进行深度遍历,就是找比它水位高的坐标,都可以流到它这里.

最后,我们把这上下左右四个边界都考虑一下

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);
    }
}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-400题汇总,希望对你有点帮助!

LeetCode刷题实战401:二进制手表

LeetCode刷题实战402:移掉 K 位数字

LeetCode刷题实战403:青蛙过河

LeetCode刷题实战404:左叶子之和

LeetCode刷题实战405:数字转换为十六进制数

LeetCode刷题实战406:根据身高重建队列

LeetCode刷题实战407:接雨水 II

LeetCode刷题实战408:有效单词缩写

LeetCode刷题实战409:最长回文串

LeetCode刷题实战410:分割数组的最大值

LeetCode刷题实战411:最短独占单词缩写

LeetCode刷题实战412:Fizz Buzz

LeetCode刷题实战413:等差数列划分

LeetCode刷题实战414:第三大的数

LeetCode刷题实战415:字符串相加

LeetCode刷题实战416:分割等和子集

b0b8fc87c60209a93cdb51fda6eeea4d.png

[leetcode417]. 太平洋大西洋水流问题 回溯法: 方法:从太平洋和大西洋分别往中间进行搜索(下一个节点的满足条件是比该节点的值大),使用两个数组分别记录每一个点是否可以流向的大西洋和是否可以流向太平洋,最后在对两个数组进行遍历,找到既能够去大西洋也能去太平洋的点。 class Solution { public: vector<vector<int>> pacificAtlantic(vector<... 阅读详情

相关推荐

C#:使用堆栈实现深度优先搜索(DFS)

在每次循环中,我们从堆栈中弹出一个节点,并将其输出。然后,对于该节点的每个未访问的邻居,我们将其标记为已访问并将其推入堆栈中。在DFS中,我们从起始节点开始,尽可能深入地探索每个分支,直到到达没有未探索邻居的节点,然后返回并继续探索其他分支。在C#中,我们可以使用堆栈(Stack)数据结构来实现DFS算法。堆栈按照后进先出(LIFO)的顺序处理元素,这非常适合DFS的实现。通过使用堆栈数据结构,我们成功地实现了C#中的深度优先搜索算法。方法中,我们创建了一个包含7个顶点的图,并添加了一些边。

ByteLegend的博客 386

Java实现 LeetCode 417 太平洋大西洋水流问题

417. 太平洋大西洋水流问题 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左...

5613

堆栈的搜索「Stack Search」-crx插件

Stack Search增加了谷歌搜索结果的答案:StackOverflow和StackExchange站点。 堆栈搜索是您梦dream以求的Chrome扩展程序! 堆栈搜索将来自最受信任的编码源(StackOverflow和StackExchange)的一组最相关的答案过滤后添加到您的Google搜索结果中。 这些结果将显示在Google SERP的右侧,以及指向所选答案确切来源的链接。 此外,该扩展程序还显示每个StackOverflow和StackExchange自然搜索结果下可用的答案数量,以及答案的分数以及后者是否被认为是可靠的。 快速安装将永远改变您搜索编码帮助的方式! 它既不占用空间,也不会使SERP加载时间变慢。 希望您喜欢它,并与他人分享并发表评论以进一步改进! **** 1.8.0版中的新功能**** 1.全新的可视化 支持语言:English

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

一、题目 二、示例 输入: heights = [[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]] 输入: heights = [[2,1],[1,2]] 输出: [[0,0],[0,1],[1,0],[1,1]] 三、思路 1、这题采用图的深度优先遍历 2、创建两个二维矩阵,其中的值都设置为false 3、分别从大西洋和太平洋海岸线起

weixin_47450807的博客 444

堆栈搜索:在你走之前知道。「Stack Search: Know before you go.」-crx插件

如果堆栈溢出结果具有可接受的答案,则向谷歌搜索结果添加指示符。 如果您经常使用堆栈溢出,您会发现从Google搜索结果页面查看问题是否有可接受的答案。这个扩展提供了这个功能。 使用StackOverflow API,没有跟踪或分析。 变化: 0.0.1 - 初始版本 0.0.2 - 列表页面的资源 0.0.3 - 增加了API密钥以减少限制问题。 0.0.4 - 切换到异步呼叫。尝试修复重新加载问题。 0.0.5 - 关掉所有的调试我smh。 支持语言:English

三极管共集电极放大电路详解:射极跟随器的原理、计算与应用

三极管放大电路是模拟电子技术的基石,常见组态包括共发射极、共基极和共集电极。其中共集电极电路因输入电阻大、输出电阻小、电压增益接近1的特性,常被用作射极跟随器,在信号缓冲、级间隔离和低阻抗负载驱动等场景中发挥关键作用。其核心价值并非电压放大,而是完成阻抗变换,将高内阻信号源转换为低内阻输出,同时保持信号幅值基本不变。理解其静态工作点计算与动态参数推导(如电压增益、输入输出电阻)是设计实用电路的前提。本文结合12V电源下的具体设计实例和仿真验证,梳理了从电路识别、参数计算到工程实践的完整流程,并指出常见设计误

weixin_29193259的博客 367

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

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

Love Peace 893

Jenkins+docker 微服务实现自动化部署安装和部署过程

本文详细介绍了如何使用Docker部署Jenkins自动化服务器。主要内容包括:1)拉取Jenkins官方或BlueOcean镜像;2)创建容器并配置端口映射、数据卷挂载;3)设置防火墙规则;4)配置清华大学镜像加速;5)安装必要插件;6)SSH密钥配置;7)构建触发器设置;8)编写自动化构建脚本。通过Docker部署Jenkins可以简化安装流程,确保环境一致性,并利用容器特性实现快速启动和管理。文章提供了完整的配置步骤和注意事项,帮助用户快速搭建CI/CD环境。

qq_33665793的博客 1687

【算法与数据结构】417、LeetCode太平洋大西洋水流问题

所有的LeetCode题解索引,可以看这篇文章——。

晚安的博客 1454

使用单片机和电流互感器对非正弦周期电流有效值测定

使用单片机和电流互感器,利用一种高速采样的方法来进行有效值测定

月光绿叶滴水音乐 3945

esp32移植canopen协议栈(二)

本文续接上一篇文章,之前我们已经搭建好了esp32的开发环境,以及初始工程。接下来我们开始实现can驱动相关,以及使用c++封装can接口。本文使用esp32实现c++实现can驱动层的封装。下一步移植canopen!!!嘻嘻。

qq_50267418的博客 1906

代码随想录算法训练Day58|LeetCode417-太平洋大西洋水流问题、LeetCode827-最大人工岛

这个过程的时间复杂度也为 n * n。所以整个解法的时间复杂度,为 n * n + n * n 也就是 n^2。

wish的博客 1354

【系统架构设计师】案例分析考点情况分析和解题技巧(包括2009~2024年考点详情)

复习方法建议仍然是以真题为主,只不过和综合题不同,标准答案并不会涵盖所有可能的考点。案例的考察方法和论文不太一样,它考察两大块的内容:

数据知道的博客 1万+

面试高频题 力扣 417. 太平洋大西洋水流问题 洪水灌溉(FloodFill) 深度优先遍历(dfs) 暴力搜索 C++解题思路 每日一题

摘要 本文深入解析了LeetCode 417题“太平洋大西洋水流问题”的解题思路。题目要求找出能同时流向太平洋和大西洋的网格坐标,关键在于逆向思维的运用。常规DFS逐个检查会超时,因此采用反向策略:分别从太平洋和大西洋边界出发,标记能逆流到达的陆地格子,最终取两者的交集。文章详细拆解了DFS实现步骤,包括方向数组、标记数组初始化及边界处理,并提供了代码示例。通过这道题,读者可掌握逆向思维和洪水灌溉算法的高效应用。

Q741_147的博客 1579

最详细的 SAP ABAP Web Service 创建和消费步骤讲解

本文原版发表于 SAP 官方社区,当时用的英文版写作,标题为:Step by step to create, consume and trace web service in ABAP system https://blogs.sap.com/2014/05/20/step-by-step-to-create-consume-and-trace-web-service-in-abap-system/ 总共阅读量超过 18 万。 How to create web service provider in A

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3151

AD9613操作控制

输出250M时钟给AD9613,过FPGA ILA逻辑分析仪将AD9613采集的两个通道ADC数据250M数据显示出来。其中AD9613输出的是LVDS数据,通过select IO核转为并行数据。 一,搜索IP核:selectIO interface wizad ,并双击配置 配置为input,DDR模式,数据位宽为12bit,IO类型为差分,这里配置的是12对数据差分对。然后配置外部差分时钟。 将tap setting 设置为13,将时钟的边沿对准数据的中间,以免数据出错 二,

wangjie36的博客 4047

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

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

qq_34434522的博客 1442

【Bug已解决】codex: debug 模式无输出 — CodeX CLI 调试模式不工作解决方案

CodeX CLI 开启 debug 模式后无输出/日志不打印的解决方案,含 debug 开关、日志级别、stderr 重定向与 IDE 日志面板。

一键难忘的博客 4165

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

417. 太平洋大西洋水流问题题目描述答案方法一:深度优先搜索方法二:广度优先搜索 题目描述 有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。 岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、

允诺@晴天的博客 2727

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

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

【LeetCode】417. Pacific Atlantic Water Flow 太平洋大西洋水流问题

有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。“太平洋”处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵heights,heights[r][c]表示坐标 (r, c) 上单元格 高于海平面的高度 。 岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。 返回网格坐标 result

负雪明烛 4242

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

33.太平洋大西洋水流问题(medium)

输入: heights = [[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]]​。输出: [[0,0],[0,1],[1,0],[1,1]]​。输入: heights = [[2,1],[1,2]]​。以及倒反天罡的思维。

doting__的博客 1048

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[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. 太平洋大西洋水流问题 C++

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

weixin_43750513的博客 456

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

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

Michael是个半路程序员 1816
上一篇: 奖金100万!北大“韦神”获奖了!
下一篇: 几道 SQL 数据分析面试题
编程IT圈
博客等级 码龄6年 1130粉丝 544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程IT圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值