操作
题一、矩阵
给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。
示例1:
输入:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]
示例2:
输入:mat = [[0,0,0],[0,1,0],[1,1,1]]
输出:[[0,0,0],[0,1,0],[1,2,1]]
方案A、广度优先遍历
function updateMatrix(matrix){
let direction=[[-1,0],[1,0],[0,-1],[0,1]];
let m=matrix.length;
let n=matrix[0].length;
let dist=new Array(m).fill(0).map(val=>new Array(n).fill(0));
let seen=new Array(m).fill(false).map(val=>new Array(n).fill(false));
let queue=[];
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(matrix[i][j]==0){
queue.push([i,j]);
seen[i][j]=true;
}
}
}
while(queue.length){
let cell=queue.shift();
let i=cell[0];
let j=cell[1];
for(let d=0;d<4;d++){
let ni=i+direction[d][0];
let nj=j+direction[d][1];
if(ni>=0&&ni<m&&nj>=0&&nj<n&&!seen[ni][nj]){
dist[ni][nj]=dist[i][j]+1;
queue.push([ni,nj]);
seen[ni][nj]=true;
}
}
}
return dist;
}
性能分析:
- 时间复杂度:O(rc),其中 r 为矩阵行数,c 为矩阵列数,即矩阵元素个数。广度优先搜索中每个位置最多只会被加入队列一次,因此只需要 O(rc) 的时间复杂度。
- 空间复杂度:O(rc),其 中 r 为矩阵行数,c 为矩阵列数,即矩阵元素个数。除答案数组外,最坏情况下矩阵里所有元素都为 0,全部被加入队列中,此时需要 O(rc) 的空间复杂度。
方案B、动态规划
function updateMatrix(matrix){
let m=matrix.length;
let n=matrix[0].length;
let dist=new Array(m).fill(0).map(val=>new Array(n).fill(Infinity));
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(matrix[i][j]==0){
dist[i][j]=0;
}
}
}
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(i-1>=0){
dist[i][j]=Math.min(dist[i][j],dist[i-1][j]+1);
}
if(j-1>=0){
dist[i][j]=Math.min(dist[i][j],dist[i][j-1]+1);
}
}
}
for(let i=m-1;i>=0;i--){
for(let j=n-1;j>=0;j--){
if(i+1<m){
dist[i][j]=Math.min(dist[i][j],dist[i+1][j]+1);
}
if(j+1<n){
dist[i][j]=Math.min(dist[i][j],dist[i][j+1]+1);
}
}
}
return dist;
}
性能分析:
题二、矩阵置零
给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。 请使用 原地 算法。
进阶:
- 一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
- 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个仅使用常量空间的解决方案吗?
示例1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
示例2:
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]