我的比較暴力的解法
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
if(matrix.size()==0) return matrix;
vector<int> dx={0,0,-1,1};
vector<int> dy={-1,1,0,0};
vector<vector<int>> res=matrix;
vector<vector<int>> tmp;
int mm=INT_MAX;
while(tmp!=res)
{
tmp=res;
for(int i=0;i<matrix.size();i++)
{
for(int j=0;j<matrix[i].size();j++)
{
mm=INT_MAX;
if(res[i][j]==0)
continue;
else
{
for(int k=0;k<4;k++)
{
if(i+dx[k]>=0&&i+dx[k]<matrix.size()&&j+dy[k]>=0&&j+dy[k]<matrix[0].size())
mm=min(mm,res[i+dx[k]][j+dy[k]]);
}
res[i][j]=mm+1;
}
}
}
}
return res;
}
};
BFS
多源BFS框架題解鏈接
level = 0
while queue 不空:
size = queue.size()
while (size --) {
cur = queue.pop()
for 節點 in cur的所有相鄰節點:
if 該節點有效且未被訪問過:
queue.push(該節點)
}
level ++;
先找到
matrix
中的所有0,然後將0加入隊列並標記訪問,從隊列中的各個 0 同時開始上下左右
的向外部擴散,擴散時,將距離爲1的點加入隊列,以此類推。
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
if(matrix.size()==0) return matrix;
vector<int> dx={0,0,-1,1};
vector<int> dy={-1,1,0,0};
vector<vector<int>> visited(matrix.size(),vector<int>(matrix[0].size(),0));
queue<vector<int>> que;
for(int i=0;i<matrix.size();i++)
{
for(int j=0;j<matrix[i].size();j++)
{
if(matrix[i][j]==0)
{
que.push({i,j});
visited[i][j]=1;
}
}
}
int level=1;
while(!que.empty())
{
int size=que.size();
for(int i=0;i<size;i++)
{
vector<int> tmp=que.front();
int x=tmp[0];
int y=tmp[1];
que.pop();
for(int k=0;k<4;k++)
{
if(x+dx[k]>=0&&x+dx[k]<matrix.size()&&y+dy[k]>=0&&y+dy[k]<matrix[0].size()&&visited[x+dx[k]][y+dy[k]]==0)
{
matrix[x+dx[k]][y+dy[k]]=level;
visited[x+dx[k]][y+dy[k]]=1;
que.push({x+dx[k],y+dy[k]});
}
}
}
level++;
}
return matrix;
}
};
DP
通過【左上到右下】和【右下到左上】的兩次狀態轉移之後,dp[i][j]的值即爲題目所求的到最近值爲0點的距離。
如果0在上下左右或者是左上 或者右下都可以通過一次狀態轉移得到。
如果0在左下或者右上,需要兩次狀態轉移積攢的的豎直方向值+水平方向值。
幫助理解
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
vector<vector<int>> dp(matrix.size(),vector<int>(matrix[0].size(),INT_MAX/2));
for(int i=0;i<matrix.size();i++)
for(int j=0;j<matrix[i].size();j++)
if(matrix[i][j]==0)
dp[i][j]=0;
for(int i=0;i<matrix.size();i++)
{
for(int j=0;j<matrix[i].size();j++)
{
if(i-1>=0)
dp[i][j]=min(dp[i][j],dp[i-1][j]+1);
if(j-1>=0)
dp[i][j]=min(dp[i][j],dp[i][j-1]+1);
}
}
for(int i=matrix.size()-1;i>=0;i--)
{
for(int j=matrix[i].size()-1;j>=0;j--)
{
if(i+1<matrix.size())
dp[i][j]=min(dp[i][j],dp[i+1][j]+1);
if(j+1<matrix[i].size())
dp[i][j]=min(dp[i][j],dp[i][j+1]+1);
}
}
return dp;
}
};