您的位置:首页 > 其它

leetcode-Set Matrix Zeroes

2016-07-06 22:57 357 查看

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;
}
}
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: