leetcode-Set Matrix Zeroes

leetcode-矩阵置零

之前趋势科技面试的时候遇到的题目:
给定一个m*n的矩阵,将含有0的元素的对应行和列都置0

注意点:
- 本题的时间复杂度很难降低,因为矩阵必须要遍历一遍,所以时间复杂度是O(mn)
- 可以考虑空间复杂度的降低,即用最少的存储空间实现题意
- 参考了一些其他人的思路,觉得降低空间复杂度的最好方法就是把遇到的每一个0都放到其对应的行的第一列,以及其列的第一行(也就是把所有要置的0都放到矩阵的第一行的第一列)。这样做的好处是节省空间,并且不会影响后续的遍历置0的过程,因为0对应的行的第一列和列的第一行都是已经遍历过的了

易错点:
-是在遇到0的时候不能马上把对应的行和列置0,否则在后续遍历中会分不清是之前矩阵的0还是后续放置的0

我错的地方:
- 没有在原来的矩阵上进行数据操作导致了没有改变原矩阵的值(C++中指针和引用可以改变原来变量的值)
- 在写一个遍历语句的时候犯了一个逻辑错误,导致只有在满足条件的时候才执行本来必须执行的语句


题目代码如下:

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        if(matrix.empty() != 1)
        {
            //代表列的临时变量
            int col = 0;
            //1表示第一列不置0
            bool isFirstRowZ = 1; 
            for (vector<int>::iterator j = matrix[0].begin(); j != matrix[0].end(); j++)
            {
                //第一列置零
                if (*j == 0 && isFirstRowZ != 0)
                {
                    isFirstRowZ = 0;
                }
            }

            for (vector<vector<int> >::iterator i = matrix.begin() + 1; i != matrix.end(); i++)
            {
                for (vector<int>::iterator j = i -> begin(); j != i -> end(); j++)
                {
                    //第一列置零
                    if (*j == 0 && (*i)[0] != 0)
                    {
                        (*i)[0] = 0;
                    }
                    //第一行置零
                    if (*j == 0 && matrix[0][col] != 0)
                    {
                        matrix[0][col] = 0;
                    }
                    ++col;
                }
                col = 0;
            }
            //根据第一行将矩阵置0
            col = 1;
            for (vector<int>::iterator j = matrix[0].begin() + 1; j != matrix[0].end(); j++)
            {
                if (*j == 0)
                {
                    for (vector<vector<int> >::iterator i = matrix.begin() + 1; i != matrix.end(); i++)
                    {
                        //列置0
                        (*i)[col] = 0;
                    }
                }
                ++col;
            }
            //根据第一列将矩阵置0
            for (vector<vector<int> >::iterator i = matrix.begin() + 1; i != matrix.end(); i++)
                    {
                        //行置0
                        if( (*i)[0] == 0)
                        {
                            for(vector<int>::iterator k = i->begin() + 1; k != i->end(); k++ )
                            {
                                *k = 0;
                            }
                        }
                    }
            //处理第一列
            if (matrix[0][0] == 0)
            {
                for (vector<vector<int> >::iterator i = matrix.begin() + 1; i != matrix.end(); i++ )
                {
                    (*i)[0] = 0;
                }
            }
            //处理第一行
            if (isFirstRowZ == 0)
            {
                for (vector<int>::iterator j = matrix[0].begin(); j != matrix[0].end(); j++)
                {
                    *j = 0;
                }
            }
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值