leetcode-Set Matrix Zeroes

来源:互联网 发布:马雅可夫斯基 知乎 编辑:程序博客网 时间:2024/06/17 20:32

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