

思路:使用常量的额外空间,肯定是要用数组的某一部分来记录0的位置,所以考虑采用第0行和第0列来记录(1,1)-->(n,n)中0的位置,因为之后第0行和第0列的值会改变,所以需要提前判断0行0列是否有0,最后做处理。
代码:
public class SetMatrixZeroes {
public static void main(String[] args) {
int[][] num = { {0,1,2,0},{3,4,5,2},{1,3,1,5} };
setZeroes(num);
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num[0].length; j++) {
System.out.print(num[i][j]+" ");
}
System.out.println();
}
}
public static void setZeroes(int[][] matrix) {
boolean rowHasZero = false;
boolean colHasZero = false;
for (int i = 0; i < matrix[0].length; i++) {
if (matrix[0][i] == 0) {
rowHasZero = true;
break;
}
}
for (int i = 0; i < matrix.length; i++) {
if (matrix[i][0] == 0) {
colHasZero = true;
break;
}
}
for (int i = 1; i < matrix.length; i++) {
for (int j = 1; j < matrix[0].length; j++) {
if (matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for (int i = 1; i < matrix[0].length; i++) {
if (matrix[0][i] == 0)
for (int j = 1; j < matrix.length; j++) {
matrix[j][i] = 0;
}
}
for (int i = 1; i < matrix.length; i++) {
if (matrix[i][0] == 0)
for (int j = 1; j < matrix[0].length; j++) {
matrix[i][j] = 0;
}
}
if (rowHasZero)
for (int i = 0; i < matrix[0].length; i++) {
matrix[0][i] = 0;
}
if (colHasZero)
for (int i = 0; i < matrix.length; i++) {
matrix[i][0] = 0;
}
}
}
输出:

矩阵置零算法

本文介绍了一种使用常量额外空间的矩阵置零算法,通过利用矩阵的第0行和第0列来标记需要置零的位置,同时处理第0行和第0列自身可能存在的零值。算法首先检查第0行和第0列是否包含零,然后遍历矩阵标记零位置,最后根据标记将相应行列置零。
593

被折叠的 条评论
为什么被折叠?



