Leetcode--Java--417. 太平洋大西洋水流问题

该博客介绍了如何使用Java解决LeetCode中的417题,即太平洋大西洋水流问题。通过反向思维,结合DFS和多源BFS算法,从海洋边界开始寻找能流向两大洋的单元格。文章详细讲解了问题描述、样例、解题思路,并提供了DFS和BFS两种方法的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。

这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。

岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。

返回 网格坐标 result 的 2D列表 ,其中 result[i] = [ri, ci] 表示雨水可以从单元格 (ri, ci) 流向 太平洋和大西洋 。

样例描述

在这里插入图片描述

思路

DFS/BFS (多源BFS)+ 反向思维

  1. 利用深搜或者广搜,题中要找的是同时流向两块海域的坐标,可以逆向思维,从两块海域的每个边界开始,找能够“水往高处流”的点,求两者之间的交集就是答案
  2. 反向思维的好处,如果直接爆搜某个点达到某种海域,判断起来很复杂,因为边界有很多点,反向的话更容易理解
  3. 注意两块海域的起始位置
  4. 注意BFS的话,有多个源头,要全部入队

代码

DFS:

class Solution {
   
    int g[][];
    int m, n;
    int dx[] = new int[]{
   0, 1, 0 ,-1};
    int dy[] = new int[]{
   1, 0, -1, 0};
    public List<List<Integer>> pacificAtlantic(int[][] heights) {
   
        m = heights.length;
        n = heights[0].length;
        g = heights;
        boolean res1[][] = new boolean[m][n];
        boolean res2[][] = new boolean[m][n];
        //水往高处流
        for(int i = 0; i < m; i ++ ) {
   
            for (int j = 0; j < n; j ++ ) {
   
                //太平洋
                if (i == 0 || j == 0) {
   
                    if (!res1[i][j]) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值