题目
思路
方法1,笨方法,首先想到的是,把0的位置先找出来存起来,然后对非零位置找离最近0的距离,这样算复杂度很高。
方法2,找邻域,确定与0的距离。
第一次循环,遍历所有点,如果当前点为0,跳过;否则,找其邻域4个点是否有0,如果有,跳过;如果没有,将该点的值+1;
第二次循环,如果当前点小于等于1,跳过;否则,找其邻域4个点是否有1,如果有,跳过;如果没有,将该点的值+1;
依次类推。在循环中,对跳过点计数,如果所有点都被跳过,则说明已完成,结束。
例如:
0 0 0
0 1 0
1 1 1
第一次循环后:
0 0 0
0 1 0
1 2 1
第二次循环所有元素都跳出,结束。
代码
方法1
struct Pos
{
int i;
int j;
Pos(int a,int b){i=a,j=b;}
};
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int n=matrix.size();
int m=matrix[0].size();
vector<Pos> tmp;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(matrix[i][j]==0)
{
Pos zero(i,j);
tmp.push_back(zero);
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!matrix[i][j])
continue;
int minDis = n+m;
for(int k=0;k<tmp.size();k++)
{
int curDis = abs(tmp[k].i - i) + abs(tmp[k].j - j);
if(minDis>curDis)
minDis = curDis;
}
matrix[i][j] = minDis;
}
}
return matrix;
}
方法2
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int n=matrix.size();
int m=matrix[0].size();
int base = 0;
int count = 0;
while(count != n*m)
{
count = 0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(matrix[i][j]<=base)
{
count++;
continue;
}
bool ava = false;
//top
if(j-1>=0)
{
if(matrix[i][j-1]==base)
ava = true;
}
//bottom
if(j+1<m)
{
if(matrix[i][j+1]==base)
ava = true;
}
//top
if(i-1>=0)
{
if(matrix[i-1][j]==base)
ava = true;
}
//bottom
if(i+1<n)
{
if(matrix[i+1][j]==base)
ava = true;
}
if(!ava)
matrix[i][j]++;
else
count++;
}
}
base++;
}
return matrix;
}
};