思路
这题要求在原地修改,空间复杂度为常数级。这题的主要思路在于用第一行第一列来保存整行整列是否为0的状态。用两个bool变量储存第一行和第一列后续是否需要变动。你可能会想如果改变第一行第一列的值但是第一行第一列本来不需要变,那怎么找回原有的值?这个不用担心,因为只要中间有了0,这个第一行或者第一列的标识迟早也会变成0,只不过早变晚变的原因。
这里需要注意的一点为[0][0]的位置,如果你在给每行每列赋值的时候从这个位置开始的话,会影响第一行第一列这个用来暂存的全部数据,导致全部变成0。那会不会漏掉第一行第一列?这两个bool变量就是负责第一行第一列的不用担心。
代码示例
func setZeroes(matrix [][]int) {
var cowB bool
var coluB bool
for i:=0;i<len(matrix);i++{
if matrix[i][0]==0{
coluB=true
break;
}
}
for i:=0;i<len(matrix[0]);i++{
if matrix[0][i]==0{
cowB=true
break;
}
}
for i:=1;i<len(matrix);i++{
for j:=1;j<len(matrix[0]);j++{
if matrix[i][j]==0{
matrix[i][0]=0
matrix[0][j]=0
}
}
}
for i:=1;i<len(matrix);i++{
if matrix[i][0]==0{
for j:=0;j<len(matrix[0]);j++{
matrix[i][j]=0
}
}
}
for i:=1;i<len(matrix[0]);i++{
if matrix[0][i]==0{
for j:=0;j<len(matrix);j++{
matrix[j][i]=0
}
}
}
if cowB{
for i:=0;i<len(matrix[0]);i++{
matrix[0][i]=0
}
}
if coluB{
for i:=0;i<len(matrix);i++{
matrix[i][0]=0
}
}
}