【4月打卡】Leetcode-542 01 矩陣

題目

我的比較暴力的解法

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]=min(dp[i1][j],dp[i+1][j],dp[i][j1],dp[i][j+1])+1 dp[i][j]=min(dp[i-1][j],dp[i+1][j],dp[i][j-1],dp[i][j+1])+1

通過【左上到右下】和【右下到左上】的兩次狀態轉移之後,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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章