其他分享
首页 > 其他分享> > [leetcode 542] js动态规划优化双100%

[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%

标签:matrix,min,100%,js,542,length,let,Math,dp
来源: https://www.cnblogs.com/dapianzi/p/12704516.html