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.

click to show follow up.

Follow up:

Did you use extra space?
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?

其实就是给了一个M*N规模的矩阵,如果某个元素为0,那么所在行和所在列的所有元素都换成0


难度:Medium

解题思路:

首先想到的是空间复杂度为O(m+n)的做法,即开一个一维数组作为标记,规模为m+n,初始状态全为1。如果原矩阵第i行j列为0,那么标记数组中的第i个元素和第i+j-1个元素置为0,也就是说标记数组的前m个用来表示每行是否有0元素,后n个元素用来表示每列是否有0元素。再遍历一次原矩阵的每行,如果标记数组第i个元素为0,该行全部改成0。 同样对每列进行一次遍历,如果标记数组的第i+j-1个元素为0,原矩阵的第j列也全部换成0. 

但是题目提示了应该用O(1)空间复杂度的做法,那么可以想到把标记值放在原来的矩阵中。 我的做法是把每行第一个元素,每列最后一个元素作为标记位点,遍历一遍原矩阵,如果第i行第j列的元素为0,则matrix[i][0]置0,matrix[最后一行坐标][j]也置0. 但是考虑到一点,如果第一列中没有0,如果这样做的话,就会导致第一列最后全部变成0了,所以我先要遍历一次第一行,如果有0,就用一个bool变量book标记,同理最后一行也是如此,用一个标记变量book2来标记原矩阵中是否最后一行中有0. 遍历原矩阵的时候,暂时不遍历最后一行,当处理完行和列(第一列用book处理)以后,再利用book2来处理最后一行。  

这么做的时间复杂度为O(m*n),空间复杂度为O(1)

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        if(matrix.size()==0)
        return;
        bool book=false;
        bool book2=false;
        if(matrix.size()==1)
        {
            for(int i = 0 ;i<matrix[0].size();i++)
            {
                if(matrix[0][i]==0)
                {
                    for(int j = 0;j<matrix[0].size();j++)
                    {
                        matrix[0][j]=0;
                   
                    }
                    return ;
                }
            }
        }
        for(int i = 0;i<matrix.size();i++)
        {
            if(matrix[i][0]==0)
            book=true;
            
        }
        for(int j = 0;j<matrix[0].size();j++)
        {
            if(matrix[matrix.size()-1][j]==0)
            {
                book2=true;
            }
        }


        for(int i = 0 ; i<matrix.size()-1;i++)
        {
            for(int j = 0; j<matrix[0].size();j++)
            {
                if(matrix[i][j]==0)
                {
                    matrix[i][0]=0;
                    if(j!=0)
                    matrix[matrix.size()-1][j]=0;
                    else if(book)
                    matrix[matrix.size()-1][j]=0;
                }
            }
        }
        for(int i = 0; i<matrix.size()-1;i++)
        {
            if(matrix[i][0]==0)
            {
                for(int j = 0; j<matrix[0].size();j++)
                {
                    matrix[i][j]=0;
                }
            }
        }
        for(int j=1;j<matrix[0].size();j++)
        {
           
            if(matrix[matrix.size()-1][j]==0)
            {
                for( int i = 0; i<matrix.size();i++)
                {
                    matrix[i][j]=0;
                }
            }
        }
        if(book)
        {
            for(int j=0;j<matrix.size();j++)
            {
                matrix[j][0]=0;
            }
            
        }
        
        
        if(book2)
        {
            for(int j=0;j<matrix[0].size();j++)
            {
                matrix[matrix.size()-1][j]=0;
            }
        }

        
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值