class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
vector<int>col,row;
for(int i=0;i<matrix.size();i++){
for(int j=0;j<matrix[0].size();j++){
if(matrix[i][j]==0){
row.push_back(i);
col.push_back(j);
}
}
}
for(int r:row){
for(int i=0;i<matrix[0].size();i++) matrix[r][i]=0;
}
for(int c:col){
for(int i=0;i<matrix.size();i++) matrix[i][c]=0;
}
}
};
看别人的解法,可以使用更少的空间,只要某个元素为0,就把矩阵这行和这列开头的元素设置为0,这样省去了很多存储的空间,使用矩阵m[0][i]和m[j][0]来记录第i列和第j行的状态,由于第一行和第一列共用了m[0][0]来记录状态,所以需要另外的变量col来存储列的状态。
解法分为两步:
1.从左上到右下遍历矩阵,利用矩阵行和列开头的值记录矩阵的状态。
2.从右下到左上遍历矩阵,只要记录值为0,便把该元素设置为0。
这样先从左上到右下,再从右下到左上,是防止记录值被覆盖。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int col=1;
for(int i=0;i<matrix.size();i++){
if(matrix[i][0]==0) col=0;
for(int j=1;j<matrix[0].size();j++){
if(matrix[i][j]==0){
matrix[i][0]=0;
matrix[0][j]=0;
}
}
}
for(int i=matrix.size()-1;i>=0;i--){
for(int j=matrix[0].size()-1;j>=1;j--){
if(matrix[i][0]==0||matrix[0][j]==0) matrix[i][j]=0;
}
if(col==0) matrix[i][0]=0;
}
}
};
这种解法不仅仅使用空间比我的少,遍历矩阵的次数也比我的少。
Python:
class Solution(object):
def setZeroes(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: None Do not return anything, modify matrix in-place instead.
"""
col,m,n=1,len(matrix),len(matrix[0])
for i in xrange(0,m):
if matrix[i][0]==0:
col=0
for j in xrange(1,n):
if matrix[i][j]==0:
matrix[0][j]=matrix[i][0]=0
for i in xrange(m-1,-1,-1):
for j in xrange(n-1,0,-1):
if matrix[0][j]==0 or matrix[i][0]==0:
matrix[i][j]=0
if col==0:
matrix[i][0]=0
leetcode [73] Set Matrix Zeroes
原文:https://www.cnblogs.com/xiaobaituyun/p/10635083.html