- 涉及到一整行一整列的状态时候,为了节省空间,可以直接考虑用第一行和第一列代表所有行和列的状态
- 但是对于(0, 0)这个点,则有保存了两个值,第1行和第1列,此时考虑用col0这个var来保存第一列的状态
- 实现的过程中,注意保证第一行和第一列的值不能被改变后再读取(必须先检测了),否则就不准确了。所以在循环中一定要注意什么时候取0,什么时候取1
- 优化的解法可以在最后赋值的时候,从右下开始,这样就可以保证先把影响小的改了,不用担心0被设置了以后又被
public void setZeroes(int[][] matrix) {
int row = matrix.length;
int col = matrix[0].length;
int col0 = matrix[0][0];
for (int i = 0; i < col; i++) {
if (matrix[0][i] == 0) {
matrix[0][0] = 0;
break;
}
}
for (int i = 1; i < row; i++) {
if (matrix[i][0] == 0) {
col0 = 0;
break;
}
}
for (int i = 1; i < row; i++) {
for (int j = 1; j < col; j++) {
if (matrix[i][j] == 0) {
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
for (int i = 1; i < row; i++) {
if (matrix[i][0] == 0) {
for (int j = 1; j < col; j++) {
matrix[i][j] = 0;
}
}
}
for (int j = 1; j < col; j++) {
if (matrix[0][j] == 0) {
for (int i = 1; i < row; i++)
matrix[i][j] = 0;
}
}
if(matrix[0][0] == 0) {
for (int i = 1; i < col; i++)
matrix[0][i] = 0;
}
if(col0 == 0) {
for (int i = 0; i < row; i++)
matrix[i][0] = 0;
}
}
for (int i = 0; i < row; i++) {
if (matrix[i][0] == 0) col0 = 0;
for (int j = 1; j < col; j++) {
if (matrix[i][j] == 0) {
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
for (int i = row - 1; i >= 0; i--) {
for (int j = col - 1; j >= 1; j--) {
if (matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
}
if (col0 == 0)
matrix[i][0] = 0;
}