思路:使用常量的额外空间,肯定是要用数组的某一部分来记录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;
}
}
}
输出: