[数据结构与算法]太平洋大西洋水流问题(图)

本文探讨了一道力扣(LeetCode)上的编程问题——如何在给定的非负整数矩阵中找出可以从太平洋流向大西洋的单元格。题目描述了水流只能按上、下、左、右四个方向且从高到低或同等高度流动,并提供了5x5矩阵的示例。解决此问题的方法并未在摘要中给出。
摘要由CSDN通过智能技术生成

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

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

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

提示:

输出坐标的顺序不重要
m 和 n 都小于150

示例:

给定下面的 5x5 矩阵:
在这里插入图片描述

返回:

[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上图中带括号的单元).

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pacific-atlantic-water-flow
解题:
在这里插入图片描述

    var matrix = [
      [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]
    ]

    var pacificAtlantic = function (matrix) {
      if (!matrix || !matrix[0]) {
        return []
      }
      const m = matrix.length; // 矩阵行数
      const n = matrix[0].length // 矩阵列数

      // 下面两行代码表示创建一个m行n列全部填充为false的二维数组
      const flow1 = Array.from({
        length: m
      }, () => new Array(n).fill(false)) // 用于记录能流到太平洋的单元
      const flow2 = Array.from({
        length: m
      }, () => new Array(n).fill(false)) // 用于记录能流到大西洋的单元

      const dfs = (r, c, flow) => { // 参数为行 列 太平洋/大西洋二维数组
        flow[r][c] = true
        ;[ // 注意:在以 “(“、”[“ 、”/“、”+”、”-“ 开头的语句前请加分号,防止运行为true[]
          [r - 1, c],
          [r + 1, c],
          [r, c - 1],
          [r, c + 1]
        ].forEach(([nr, nc]) => { // nr,nc代表下一个行/列
          if (
            // 保证下一个节点在矩阵中
            nr >= 0 && nr < m && nc >= 0 && nc < n &&
            // 防止死循环
            !flow[nr][nc] &&
            // 保证逆流而上
            matrix[nr][nc] >= matrix[r][c]
          ) {
            dfs(nr, nc, flow)
          }
        })
      }

      // 沿着海岸线逆流而上
      for (let r = 0; r < m; r++) {
        dfs(r, 0, flow1)
        dfs(r, n - 1, flow2)
      }
      for (let c = 0; c < n; c++) {
        dfs(0, c, flow1)
        dfs(m - 1, c, flow2)
      }

      // 收集能流到两个大洋中的坐标
      const res = []
      for (let r = 0; r < m; r++) {
        for (let c = 0; c < n; c++) {
          if (flow1[r][c] && flow2[r][c]) {
            res.push([r, c])

          }
        }
      }
      return res
    }
    console.log(pacificAtlantic(matrix))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值