零矩阵
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
示例 2:
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
思想1:先找到数组中为0的,把改位置行和列中除0外的值变为-99(偷鸡做法),然后再遍历把-99的变为0
代码1:
void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
for(int i = 0;i<matrixSize;i++)
for(int p = 0;p<*matrixColSize;p++)
{
if(matrix[i][p]==0)
{
for(int u = 0;u<matrixSize;u++)
{
if(matrix[u][p]!=0)
matrix[u][p] = -99;
}
for(int o = 0;o<*matrixColSize;o++)
{
if(matrix[i][o]!=0)
matrix[i][o] =-99;
}
}
}
for(int i = 0;i<matrixSize;i++)
for(int p = 0;p<*matrixColSize;p++)
{
if(matrix[i][p]==-99)
{
matrix[i][p]=0;
}
}
return matrix;
}
代码2:
void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
int i,j=0;
int tem[matrixSize*(*matrixColSize)][2];//利用一个二维数组存放为0的下标,第一列为行,第二列为列
//所以定义一个行最大为原数组元素的个数,列为2的数组
int count=0;
int k=0;
for (i=0;i<matrixSize;i++)
{
for(j=0;j<(*matrixColSize);j++)
{
if(matrix[i][j]==0)
{
tem[count][0]=i;
tem[count][1]=j; //把0的下表存入数组
count++; //统计0元素的行数
}
}
}
if(count!=matrixSize*(*matrixColSize)) //如果数组中全为0,就不需要执行赋0操作
{
for(k=0;k<count;k++) //遍历tem数组,找到原数组0的行
{
for(i=0;i<*matrixColSize;i++)
{
if(matrix[tem[k][0]][i]!=0) //判断该列是否为0 若不为0,赋0
{
matrix[tem[k][0]][i]=0;
}
}
for(j=0;j<matrixSize;j++) //判断该行是否为0 若不为0,赋0
{
if(matrix[j][tem[k][1]]!=0)
{
matrix[j][tem[k][1]]=0;
}
}
}
// for (i=0;i<matrixSize;i++)
// {
// for(j=0;j<(*matrixColSize);j++)
// {
// printf("%d ",matrix[i][j]);
// }
// printf("\n");
// }
}
else
{
return;
}
}