问题描述
给矩阵置0,就是找矩阵中为0的元素,将其同行同列置0,必须是就地算法(in-place)
1. Example 1: - input:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
- output:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
- Example 2:
input:
[ [0,1,2,0], [3,4,5,2], [1,3,1,5] ]
output:
[ [0,0,0,0], [0,4,5,0], [0,3,1,0] ]
整体思路
思路1.0版本,朴素想法
最朴素想法,先找为0的坐标,然后将其同行同列置0。这里有个小trick,找到为0的地方不能立即置0,下侧和右侧会导致判断失误。
代码1.0
1 | private void setZeroes(int[][] matrix) { |
思路2.0版本
上个版本肯定是不work的啦,毕竟最朴素想法时空只能打败30%左右的样子。作为一个never setter的人,怎么能容忍这么高的时空复杂度。
上一种方法空间复杂度为O(m*n),我想办法降到O(1)。注意到当检查到matrix[i][j] == 0 ,不能直接所有行 列置0的原因是会影响下侧和右侧的判断。但是上侧和左侧不会影响,故我们不再使用HashMap,直接将matrix[i][0] = matrix[0][j] = 0 ,然后再检查一下行列开头即可。注意如果本来第0行或者第0列就有0,需要用一个flag来记忆一下,然后再判定置0。
代码2.0
1 | private void setZeroes2(int[][] matrix){ |
中等题就是这样,解出来比较简单,但是想要拿个top还是比较难的。不管怎样,第二种解法也是top 98%的存在。那么就来个九转大肠鼓励一下自己吧!