題意:給你一個矩陣只包含元素0和1,求的一個矩陣,該矩陣在原矩陣為1的位置得出該元素距離最近的0的距離(僅能上下左右)。
解題思路:
動態(tài)規(guī)劃思路,矩陣中的某一點,如果在原矩陣中是0,那么該點在當前矩陣中也是0,;如果在原矩陣中不為0,那么該點到0的最近距離可由該點附近的點(上下左右)的最小值+1得出。
使用兩個循環(huán),第一個循環(huán)從上至下、從左至右,第二次循環(huán)從下往上從右向左。
這樣兩次循序可保證一個點一定和周圍的點比較過,且一定是最小值。
class Solution {
private:
const int INTMAX = 0x4fffffff;
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int n = matrix.size();
int m = matrix[0].size();
vector<vector<int>> ans(n, vector<int>(m, INTMAX));
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
if(matrix[i][j] == 0)
ans[i][j] = 0;
else{
if(i > 0)
ans[i][j] = min(ans[i][j], ans[i-1][j]+1);
if(j > 0)
ans[i][j] = min(ans[i][j], ans[i][j-1]+1);
}
for(int i = n-1; i >= 0; i--)
for(int j = m-1; j >=0; j--)
if(ans[i][j] != 0){
if(i < n-1)
ans[i][j] = min(ans[i][j], ans[i+1][j]+1);
if(j < m-1)
ans[i][j] = min(ans[i][j], ans[i][j+1]+1);
}
return ans;
}
};
注意:
一、二維vector的初始化
vector<vector<int>> ans(n, vector<int>(m, INTMAX));
n:該vector共有多少個行vector
vector<int>(m, INTMAX):每個vector初始化,每個vector共有m個元素,每個元素的值為INTMAX。
二、從上之下從左至右、從下至上從右向左的動態(tài)規(guī)劃思想。