LeetCode073. Set Matrix Zeroes矩阵置零

LeetCode073. Set Matrix Zeroes矩阵置零


Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

给定一个m x n 矩阵,如果一个元素是0,整个行和列设置为0。用原地算法。


在计算机科学中,一个原地算法(in-place algorithm)是一种使用小的,固定数量的额外之空间来转换资料的算法。


解题思路:

假设矩阵A如下, A 11 A_{11} A11为0

0 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

处理后

0 0 0 0
0 1 1 1
0 1 1 1
0 1 1 1

A i j A_{ij} Aij为0,则第i行和第j列的元素都会置零。


按扫描顺序(从左至右从上至下),对矩阵进行操作。具体步骤:
1) 当第i行第j列的元素为0,那么标记第i行的行首[i][0]为0,第j列的列首[0][j]为0。
2) 标记完毕,先按行把1m-1行行首为0的行全部置零,然后按列把1n-1列列首为0的列全部置零。
3) 最后处理首行首列

我们发现,2中会将首行首列的部分值置零,导致无法区分这些0是不是本身就是0。
所以需要提前标记,首行和首列是否包含0。

修正方法:

1) 如果第一个元素为0,首行首列都包含0;否则,依次扫描首行和首列,分别标记包含0的情况。
2) 扫描第[1][1]至[m-1][n-1]的所有元素,并对相应的行首和列首进行置零操作。
3) 把第1m-1行和第1n-1列中行首列首为0的分别进行整行整列的置零操作。
4) 根据首行首列的包含0的标记,对首行首列进行置零操作。

testcase:

0 1 1 1 0 0 0 0
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1

1 0 1 1 0 0 0 0
1 1 1 1 1 0 1 1
1 1 1 1 1 0 1 1
1 1 1 1 1 0 1 1

1 1 1 1 0 1 1 1
0 1 1 1 0 0 0 0
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1

1 1 1 1 1 1 0 1
1 1 0 1 0 0 0 0
1 1 1 1 1 1 0 1
1 1 1 1 1 1 0 1


你可能感兴趣的:(coding)