题目描述
- 01 矩阵
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
解题思路
- 每一个‘1’的距离与自身临近的上、下、左、右四个位置相关
dp[curr] = min(dp[curr], dp[prev] + 1)// curr当前位置,prev为上、下、左、右四个位置
- 需要‘左-右’、‘上-下’、‘右-左’、‘下-上’四遍动态规划遍历
- 结合矩阵遍历的特点可以优化为‘左上-右下’、‘右下-左上’两遍动态规划
- 直接用原矩阵作为状态矩阵
代码
/**
* @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%