leetcode [73] Set Matrix Zeroes
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place.
Example 1:
Input:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
Output:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
Example 2:
Input:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
Output:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
Follow up:
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
题目大意:
如果说矩阵某个位置出现了0,那么这个矩阵出现了这个元素的行和列元素都设置为0。
解法:
题目看起来挺简单的,我想的是我先遍历一遍矩阵,将矩阵中出现了0的元素的行和列记录到一个数组,最后将记录的行和列的元素设置为0,但其实这样用到的空间是o(m+n)。
C++:
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

浙公网安备 33010602011771号