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