zoukankan      html  css  js  c++  java
  • [leetcode 542] js动态规划优化双100%

    题目描述

    1. 01 矩阵
      给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
      两个相邻元素间的距离为 1 。

    解题思路

    1. 每一个‘1’的距离与自身临近的上、下、左、右四个位置相关
    2. dp[curr] = min(dp[curr], dp[prev] + 1)// curr当前位置,prev为上、下、左、右四个位置
    3. 需要‘左-右’、‘上-下’、‘右-左’、‘下-上’四遍动态规划遍历
    4. 结合矩阵遍历的特点可以优化为‘左上-右下’、‘右下-左上’两遍动态规划
    5. 直接用原矩阵作为状态矩阵

    代码

    /**
     * @param {number[][]} matrix
     * @return {number[][]}
     */
    var updateMatrix = function(matrix) {
        // dp optimise
        if (matrix.length==0) {
            return [];
        }
        let m=matrix.length,n=matrix[0].length;
        // left-top to right-bottom
        for (let i=0;i<m;i++) {
            for (let j=0;j<n;j++) {
                if (matrix[i][j] != 0) {
                    matrix[i][j] = m+n;
                    if (i > 0) {
                        matrix[i][j] = Math.min(matrix[i-1][j] + 1, matrix[i][j]);
                    }
                    if (j > 0) {
                        matrix[i][j] = Math.min(matrix[i][j-1] + 1, matrix[i][j]);
                    }
                }
            }
        }
        // right-bottom to left-top
        for (let i=m-1;i>=0;i--) {
            for (let j=n-1;j>=0;j--) {
                // distance
                if (matrix[i][j] != 0) {
                    if (j < n-1) {
                        matrix[i][j] = Math.min(matrix[i][j], matrix[i][j+1] + 1);
                    }
                    if (i < matrix.length-1) {
                        matrix[i][j] = Math.min(matrix[i][j], matrix[i+1][j] + 1);
                    }
                }
            }
        }
        return matrix;
    };
    

    结果

    人生第一次双100%

  • 相关阅读:
    编译 | 更新标准库_交叉编译工具链
    论文 | 图文_学科
    编码 | 二进制格式设计方案
    图片 | 图片上传管理
    进程 | 查询进程中包含多少线程
    第二周02:Fusion ICP逐帧融合
    exe文件当前目录搜索文件
    第一周:读取XML深度数据并将其重建为三维点云
    第二周:01 ICP迭代交互
    C++文件读写(转载)
  • 原文地址:https://www.cnblogs.com/dapianzi/p/12704516.html
Copyright © 2011-2022 走看看