给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
示例 2:
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
进阶:
这个题的整体思想是减少空间,改进方案是可以用两个一维数组记录行列信息,如果某行或者某列有0,则将数组对应位置置零,然后最后根据这两个一维数组对矩阵进行操作。如果要使用常数空间,那么可以用两个标识来记录第一行和第一列,然后使用第一行和第一列来记录对应行列的零信息,因为只要有0就行列都置零,所以有零时先将第一行和第一列的对应位置置零即可。
最后先根据第一行和第一列将整个矩阵除第一行和第一列之外的部分进行处理,然后根据两个标识来处理第一行和第一列。
C++源代码:
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if(matrix.empty() || matrix[0].empty()) return;
int m = matrix.size(), n = matrix[0].size();
bool row_flag=false, col_flag=false;
for(int i=0;i<m;i++){
if(matrix[i][0] == 0)
row_flag = true;
}
for(int j=0;j<n;j++){
if(matrix[0][j] == 0)
col_flag = true;
}
for(int i=1;i<m;i++)
for(int j=1;j<n;j++){
if(matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
for(int i=1;i<m;i++)
for(int j=1;j<n;j++){
if(matrix[i][0]==0 || matrix[0][j]==0)
matrix[i][j] = 0;
}
if(row_flag)
for(int i=0;i<m;i++)
matrix[i][0] = 0;
if(col_flag)
for(int j=0;j<n;j++)
matrix[0][j] = 0;
}
};
python3源代码:
class Solution:
def setZeroes(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: void Do not return anything, modify matrix in-place instead.
"""
if len(matrix)==0 or len(matrix[0])==0:
return
m = len(matrix)
n = len(matrix[0])
rowFlag = False
colFlag = False
for i in range(m):
if matrix[i][0]==0:
rowFlag = True
for j in range(n):
if matrix[0][j]==0:
colFlag = 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):
for j in range(1, n):
if matrix[i][0]==0 or matrix[0][j]==0:
matrix[i][j] = 0
if rowFlag:
for i in range(m):
matrix[i][0] = 0
if colFlag:
for j in range(n):
matrix[0][j] = 0