首页 > 其他 > 详细

leetcode [73] Set Matrix Zeroes

时间:2019-04-01 11:01:14      阅读:183      评论:0      收藏:0      [点我收藏+]
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

  

 

 

leetcode [73] Set Matrix Zeroes

原文:https://www.cnblogs.com/xiaobaituyun/p/10635083.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!