給定一個m x n的矩陣,如果某個元素爲0,則把該元素所在行和列全部置0。
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
分析:最直接想到的就是遍歷該矩陣,每遇到0就把它所在的行和列全部置0,但這是錯的,因爲這樣會引入新的0到矩陣中。下一個比較容易相到的方法是:遍歷矩陣,每遇到一個0元素就把它所在的行和列標記起來,最後再遍歷matrix,若某元素的行或者列下標被標記,則置爲0,這種方法實現方便,但是其空間複雜度爲O(m+n)。如果先按行遍歷,當遇到0時,就把該行的所有非0元素置爲UINT_MAX;然後按列遍歷,若遇到UNIT_MAX的元素就把其置爲0,若遇到0元素就把整列置爲0,這樣就做到了O(1)的空間複雜度。下面把這兩種方法的代碼都貼上:
空間複雜度O(m+n)的方法:
class Solution {
public:
void setZeroes(vector<vector<int> > &matrix)
{
int m = matrix.size();
if(0 == m) return;
int n = matrix[0].size();
int *rowFlags = new int[m]();
int *colFlags = new int[n]();
for (int i=0; i<m; ++i)
{
for (int j=0; j<n; ++j)
{
if (matrix[i][j] == 0)
{
rowFlags[i] = 1;
colFlags[j] = 1;
}
}
}
for (int i=0; i<m; ++i)
{
for (int j=0; j<n; ++j)
{
if (rowFlags[i] || colFlags[j])
matrix[i][j] = 0;
}
}
delete [] rowFlags;
delete [] colFlags;
}
};
空間複雜度爲O(1)的方法:
class Solution {
public:
void setZeroes(vector<vector<int> > &matrix)
{
int m = matrix.size();
if(0 == m) return;
int n = matrix[0].size();
// 按行遍歷,把包含0的行中的所有非0數用UINT_MAX標記
for (int i=0; i<m; ++i)
{
for (int j=0; j<n; ++j)
{
if (matrix[i][j] == 0)
{
for (j=0; j<n; ++j)
{
if (matrix[i][j] != 0)
matrix[i][j] = UINT_MAX;
}
break;
}
}
}
// 按列遍歷,把包含0的列中的所有數字置爲0,並把UINT_MAX的元素置爲0
for (int i=0; i<n; ++i)
{
for (int j=0; j<m; ++j)
{
if (matrix[j][i] == 0)
{
for (j=0; j<m; ++j)
matrix[j][i] = 0;
break;
}
if(matrix[j][i] == UINT_MAX)
matrix[j][i] = 0;
}
}
}
};