Given a m x n
matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Задана матрица m x n.
Если ее элемент равен 0, то установите все элементы соответствующих столбца и
строки в 0. Используйте константную память.
// C++
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
}
};
// Java
public class Solution {
public void
setZeroes(int[][] matrix) {
}
}
обработка массивов
Проверим, содержит ли первая строка нули, занесем эту информацию в
переменную FirstRow булевого типа. Аналогично
проверим, содержит ли первый столбец нули, и занесем эту информацию в
переменную FirstColumn булевого типа.
Теперь в matrix[i][0] занесем 0,
если в i-ой строке содержится 0. Аналогично
в matrix[0][j] занесем 0, если в j-ом столбце содержится 0. Для этого
перебираем все элементы матрицы и если matrix[i][j] = 0, то
устанавливаем matrix[0][j] = matrix[i][0] = 0.
Теперь имея информацию о присутствии нулей в каждой строке и каждом столбце,
за один проход по матрице устанавливаем matrix[i][j] = 0, если только matrix[i][0] = 0 или matrix[0][j] = 0.
Если FirstRow = true, то обнуляем первую строку.
Если FirstColumn = true, то обнуляем первый столбец.
Реализация алгоритма
class Solution
{
public:
void setZeroes(vector<vector<int>>& matrix)
{
bool FirstColumn = false;
bool FirstRow = false;
int i, j;
//set first column zero or not
for(i = 0; i < matrix.size(); i++)
if(matrix[i][0] == 0)
{
FirstColumn = true;
break;
}
//set first row zero or not
for(i = 0; i < matrix[0].size(); i++)
if(matrix[0][i] == 0)
{
FirstRow = true;
break;
}
//mark zeros on first row and column
for(i = 1; i < matrix.size(); i++)
for(j = 1; j < matrix[0].size(); j++)
if(matrix[i][j] == 0)
{
matrix[i][0] =
0;
matrix[0][j] =
0;
}
//use mark to set elements
for(i = 1; i < matrix.size(); i++)
for(j = 1; j < matrix[0].size(); j++)
if(matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
//set first column and row
if(FirstColumn)
for(i = 0; i < matrix.size(); i++)
matrix[i][0] =
0;
if(FirstRow)
for(i = 0; i < matrix[0].size(); i++)
matrix[0][i] =
0;
}
};
Java реализация
public class
Solution
{
public void
setZeroes(int[][] matrix)
{
boolean FirstColumn
= false;
boolean FirstRow = false;
int i, j;
//set first column zero or not
for(i = 0; i < matrix.length; i++)
if(matrix[i][0] == 0)
{
FirstColumn = true;
break;
}
//set first row zero or not
for(i = 0; i < matrix[0].length; i++)
if(matrix[0][i] == 0)
{
FirstRow = true;
break;
}
//mark zeros on first row and column
for(i = 1; i < matrix.length; i++)
for(j = 1; j < matrix[0].length; j++)
if(matrix[i][j] == 0)
{
matrix[i][0] =
0;
matrix[0][j] =
0;
}
//use mark to set elements
for(i = 1; i < matrix.length; i++)
for(j = 1; j < matrix[0].length; j++)
if(matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
//set first column and row
if(FirstColumn)
for(i = 0; i < matrix.length; i++)
matrix[i][0] =
0;
if(FirstRow)
for(i = 0; i < matrix[0].length; i++)
matrix[0][i] =
0;
}
}