将二维矩阵0元素所在行列都标记为0

来源:互联网 发布:如何通过网络看电视 编辑:程序博客网 时间:2024/05/22 14:15

题目:将二维矩阵0元素所在行列都标记为0,要求空间复杂度为o(1)。 比如

 

1 2 3 4       

5 6 0 8

9 1 3 5

0 5 7 4

 

两个0所在的行列分别是[1,2]和[3,0],即行1、3,列 0、2的所有元素都变成0。标记后变成:

 

0 2 0 4

0 0 0 0

0 1 0 5

0 0 0 0

 

从第0行开始遍历矩阵,遇到0,将0所在的行和列都标记成0,跳过这行,继续下一行。可是这样问题在于,在第二行的时候遇到0,这个0是原来就有的,还是第一步的时候被标记成的呢?

 

遇到0的时候,将这一行都标记成0是可以的,因为以后不会再回溯回去了。但是不能在此时将列也全部变成0,需要一个方法记住0所在的列,在遍历一次以后,处理完所有的行了,再遍历一次,将刚才记住的列都标记成0才算完事儿。

 

[方法一] 第一次遍历时,遇到0,将这个0变成1,这一行的其他元素都变成0,这样就把这个0的位置记下来了。第二次遍历(从第0列开始遍历),遇到1的时候,要看这个1个左边或者右边,是不是0,如果不是0的话,那这个1就是初始的数;如果是0的话,说明这个1是刚才标记的,这时可以将1所在的列都标记成0。这种方法的时间复杂度是o(mn)--还是o(mnn)?

 

[方法二] 不能额外分配空间来记住0所在的列,可以用这个矩阵本身来记啊。第一次遍历,遇到第一个0,将这行作为标记行,0变成1,这行其他元素都变成0;继续遍历,遇到0,将该行都变成0,对应标记行的那个元素变成1。这样第一次遍历完成后,标记行就记下了哪些列应该变成0。第二次遍历只需遍历这个标记行,将1所在的列都变成0即可收工。时间复杂度是o(mn)。

 

原创粉丝点击