73. 矩阵置零
矩阵置零
给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
实例一:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]
实例二:
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]] 输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
思路
- 使用第 0 行和第 0 列来标记哪些行和列需要置为 0。
- 在扫描矩阵时,通过第 0 行和第 0 列来标记相关的行和列。
- 最后,根据这些标记置 0。
- 为了不破坏原始矩阵的信息,遍历时从第 1 行和第 1 列开始,同时处理第 0 行和第 0 列时单独处理。
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
boolean flagRow0 = false;
boolean flagCol0 = false;
//检查第0行是否有0
for(int i = 0; i < n; i++){
if(matrix[0][i] == 0){
flagRow0 = true;
}
}
//检查第0列是否有0
for(int i = 0; i < m; i++){
if(matrix[i][0] == 0){
flagCol0 = true;
}
}
//如果(i,j)处为0,将其所在的行和列的第一个元素标记为0
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
if(matrix[i][j] == 0){
matrix[i][0] = matrix[0][j] = 0;
}
}
}
//根据前面的标记进行实际的置0操作
for(int i = 1; i < m ; i++){
for(int j = 1; j < n; j++){
if(matrix[i][0] == 0 || matrix[0][j] == 0){
matrix[i][j] = 0;
}
}
}
//处理第0行
for(int i = 0; i < n; i++){
if(flagRow0){
matrix[0][i] = 0;
}
}
//处理第0列
for(int i = 0; i < m; i++){
if(flagCol0){
matrix[i][0] = 0;
}
}
}
}
[!NOTE]
- 第 0 行,第 0 列是用来做标记的,所以在进行标记处理的时候,是从 1 开始的。
- 问题解释:前面两个for循环以及两个布尔变量的作用是,用于处理第0行或者第0列本身就存在0的情况。