标签:matrix min 100% js 542 length let Math dp
题目描述
- 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%
标签:matrix,min,100%,js,542,length,let,Math,dp 来源: https://www.cnblogs.com/dapianzi/p/12704516.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。