leetcode 刷题之路 46 Set Matrix Zeroes

来源:互联网 发布:西安星河网络小贷 编辑:程序博客网 时间:2024/06/08 08:21

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?

给定一个数组,如果数组中存在数字0,则把该数字0所在行和列的元素都清零,要求常数空间复杂度完成 这个问题。

首先判断第一行和第一列中是否有含0的数字,设置两个变量isRow1Zero,isClmn1Zero来记录。然后使用第一行和第一列来作为临时记录空间,遍历整个矩阵,对于遍历到的数字0,将它所在行和列的行首和列首改为0。遍历完成后,哪些行和列最终要清零其实已经保存到了矩阵第一行和第一列,接下来遍历第一行,将第一行中数字0所处的列清零,遍历第一列,将第一列中数字0所处的行清零,最后再根据isRow1Zero,isClmn1Zero的值对第一行和第一列进行处理。
AC code:

class Solution {public:    void setZeroes(vector<vector<int> > &matrix)     {        int isRow1Zero=0,isClmn1Zero=0;        for(int i=0;i<matrix.size();i++)            if(matrix[i][0]==0)                isClmn1Zero=1;        for(int i=0;i<matrix[0].size();i++)            if(matrix[0][i]==0)                isRow1Zero=1;        for(int i=0;i<matrix.size();i++)            for(int j=0;j<matrix[0].size();j++)                if(matrix[i][j]==0)                {                    matrix[i][0]=0;                    matrix[0][j]=0;                }                for(int i=1;i<matrix.size();i++)            if(matrix[i][0]==0)            {                for(int j=1;j<matrix[0].size();j++)                    matrix[i][j]=0;            }        for(int i=1;i<matrix[0].size();i++)        {            if(matrix[0][i]==0)            {                for(int j=1;j<matrix.size();j++)                {                    matrix[j][i]=0;                }            }        }        if(isRow1Zero==1)        {            for(int i=0;i<matrix[0].size();i++)                matrix[0][i]=0;        }        if(isClmn1Zero==1)        {            for(int i=0;i<matrix.size();i++)                matrix[i][0]=0;        }    }};



0 0
原创粉丝点击