题目描述
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
样例1
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
样例2
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
算法1
(原地算法) $O(n^2)$
* 先用两个变量记录首行和首列是否需要置零,然后利用首行和首列来记录剩下的部分是否需要置零
* 注意:首行首列的0值已经不用更改了,只需要把剩下要置零的行列标记出来即可
* 填充完首行首列的标记后,遍历每一行每一列,需要置零的全部置零
* 最后判断首行首列是否需要置零即可
Java 代码
class Solution {
public void setZeroes(int[][] matrix) {
if(matrix.length == 0 || matrix[0].length == 0) return;
int n = matrix.length, m = matrix[0].length;
int r0 = 1, c0 = 1;//0表示没有0,1表示有0
//判断第1列有没有0
for(int i = 0; i < n; i++){
if(matrix[i][0] == 0) c0 = 0;
}
//判断第1行有没有0
for(int i = 0; i < m; i++){
if(matrix[0][i] == 0) r0 = 0;
}
//判断剩下的部分
for(int i = 1; i < n; i++){
for(int j = 1; j < m; j++){
if(matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
//填充每行的0
for(int i = 1; i < n; i++){
if(matrix[i][0] == 0){
for(int j = 1; j < m; j++){
matrix[i][j] = 0;
}
}
}
//填充每列的0
for(int i = 1; i < m; i++){
if(matrix[0][i] == 0){
for(int j = 1; j < n; j++){
matrix[j][i] = 0;
}
}
}
if(c0 == 0){
for(int i = 0; i < n; i++){
matrix[i][0] = 0;
}
}
if(r0 == 0){
for(int i = 0; i < m; i++){
matrix[0][i] = 0;
}
}
}
}