题目:
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,第一次遍历完矩阵后,再进行第二次遍历,将第一行和第一列上标识了0元素的行列进行置0操作,为了对一些第一行和第一列自带的0元素与置0操作后标志为0的元素进行区别,这里还用到了fr和fc两个变量,含义是first row 和first column,主要用于判断第一行和第一列是否一开始就含有0元素,有的话设置为true,(注意在第二次遍历的时候,要从第二行和第二列开始,因为最后会对第一列和第一行进行最终的判断操作。)两次遍历完后,最后再对第一行和第一列进行置0的操作。
Java版本:
class Solution {
public void setZeroes(int[][] matrix) {
boolean fr = false,fc = false;
for(int i = 0; i < matrix.length; i++) {
for(int j = 0; j < matrix[0].length; j++) {
if(matrix[i][j] == 0) {
if(i == 0) fr = true;
if(j == 0) fc = true;
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
for(int i = 1; i < matrix.length; i++) {
for(int j = 1; j < matrix[0].length; j++) {
if(matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
if(fr) {
for(int j = 0; j < matrix[0].length; j++) {
matrix[0][j] = 0;
}
}
if(fc) {
for(int i = 0; i < matrix.length; i++) {
matrix[i][0] = 0;
}
}
}
}
Python版本:
class Solution:
# @param {integer[][]} matrix
# @return {void} Do not return anything, modify matrix in-place instead.
def setZeroes(self, matrix):
m = len(matrix)
if m == 0:
return
n = len(matrix[0])
row_zero = False
for i in range(m):
if matrix[i][0] == 0:
row_zero = True
col_zero = False
for j in range(n):
if matrix[0][j] == 0:
col_zero = True
for i in range(1, m):
for j in range(1, n):
if matrix[i][j] == 0:
matrix[i][0] = 0
matrix[0][j] = 0
for i in range(1, m):
if matrix[i][0] == 0:
for j in range(1, n):
matrix[i][j] = 0
for j in range(1, n):
if matrix[0][j] == 0:
for i in range(1, m):
matrix[i][j] = 0
if col_zero:
for j in range(n):
matrix[0][j] = 0
if row_zero:
for i in range(m):
matrix[i][0] = 0
void setZeroes(vector<vector<int> > &matrix) {
int col0 = 1, rows = matrix.size(), cols = matrix[0].size();
for (int i = 0; i < rows; i++) {
if (matrix[i][0] == 0) col0 = 0;
for (int j = 1; j < cols; j++)
if (matrix[i][j] == 0)
matrix[i][0] = matrix[0][j] = 0;
}
for (int i = rows - 1; i >= 0; i--) {
for (int j = cols - 1; j >= 1; j--)
if (matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
if (col0 == 0) matrix[i][0] = 0;
}
}