zoukankan      html  css  js  c++  java
  • 417、太平洋大西洋水流问题 | 图-JS

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

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

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

    提示:

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

    示例:

    给定下面的 5x5 矩阵:

      太平洋 ~   ~   ~   ~   ~
           ~  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]] (上图中带括号的单元)

     1 /**
     2  * @param {number[][]} heights
     3  * @return {number[][]}
     4  */
     5 var pacificAtlantic = function(matrix) {
     6     //排查矩阵为空的情况,或者不是一个二维矩阵
     7     if(!matrix || !matrix[0]) return [];
     8     const m = matrix.length;
     9     const n = matrix[0].length;
    10     //新建两个矩阵来记录
    11     const flow1 = Array.from({ length: m} , () => new Array(n).fill(false));
    12     const flow2 = Array.from({ length: m} , () => new Array(n).fill(false));
    13     
    14     const dfs = (r , c , flow) => {
    15         flow[r][c] = true;
    16         [[r-1,c],[r+1,c],[r,c-1],[r,c+1]].forEach(([nr,nc]) => {
    17             if(
    18                 //保证要在矩阵中
    19                 nr >= 0 && nr < m &&
    20                 nc >= 0 && nc < n &&
    21                 //防止死循环
    22                 !flow[nr][nc] &&
    23                 //保证逆流而上
    24                 matrix[nr][nc] >= matrix[r][c]
    25             ){
    26                 dfs(nr, nc, flow);
    27             }
    28         })
    29     }
    30 
    31     // 沿着海岸线逆流而上
    32     for(let r = 0; r < m ; r++){
    33         dfs(r,0,flow1);
    34         dfs(r,n-1,flow2);
    35     }
    36     for(let c = 0; c< n;c++){
    37         dfs(0, c , flow1);
    38         dfs(m-1, c , flow2);
    39     }
    40     // 收集能流到两个大洋里的坐标
    41     const res = [];
    42     for(let r = 0; r<m ; r++) {
    43         for(let c = 0; c<n ; c++){
    44             if(flow1[r][c] && flow2[r][c]){
    45                 res.push([r,c]);
    46             }
    47         }
    48     }
    49     return res;
    50 };
  • 相关阅读:
    [转]软件产品质量和代码质量
    FF,IE8 正确, IE7 报错, 加载不上JS文件 的错误.
    转 让eval()全局作用域执行的方法深入研究(javascript)
    集群、分布式、负载均衡区别与联系
    Microsoft.Jet.OLEDB.4.0”提供程序不支持 ITransactionLocal 接口。本地事务不可用于当前提供程序
    C#调用COM组件的几个步骤
    sql server中分布式查询随笔(sp_addlinkedserver、sp_addlinkedsrvlogin)
    全文检索定义
    浅谈c#中使用lock的是与非
    使用SQL SERVER 2000的全文检索功能
  • 原文地址:https://www.cnblogs.com/oaoa/p/14853597.html
Copyright © 2011-2022 走看看