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

题目:将二维矩阵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)。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值