给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
补全 void setZeroes(int** matrix, int matrixSize, int* matrixColSize) 函数
matrixsize是数组matrix的行数,*matrixcolsize是函数的列数
思路:
一、申请两个数组x,y进行存储数组为0数的位置;
x数组存储的是为零数的行数;
y数组存储的是为零数的列数
//申请两个数组存储x,y存储每个为0数的行和列
int *x = calloc(matrixSize , sizeof(int));
int *y = calloc(*matrixColSize , sizeof(int));
二、遍历整个数组,将为零数的位置记录下来
//遍历数组
for(int i = 0;i < matrixSize;i++)
{
for(int j = 0;j < *matrixColSize;j++)
{ //当当前的数为0时,记录该数的行和列
if (*(*(matrix + i)+j) == 0)
{ //将当前的行和列值置为1
x[i] = 1;
y[j] = 1;
}
}
}
三、遍历x数组和y数组将其中为1的行和列的值全置为0
//遍历数组x,若为1将这行的数全置为0
for(int i = 0;i < matrixSize;i++)
{
if(x[i] == 1)
{
for(int j = 0 ; j < *matrixColSize ;j++ )
{
matrix[i][j] = 0;
}
}
}
//遍历数组y,若为1将这列的数全置为0
for(int i = 0; i < *matrixColSize;i++)
{
if(y[i] == 1)
{
for(int j = 0 ; j < matrixSize ;j++ )
{
matrix[j][i] = 0;
}
}
}
完整代码
//申请两个数组存储x,y存储每个为0数的行和列
int *x = calloc(matrixSize , sizeof(int));
int *y = calloc(*matrixColSize , sizeof(int));
//遍历数组
for(int i = 0;i < matrixSize;i++)
{
for(int j = 0;j < *matrixColSize;j++)
{ //当当前的数为0时,记录该数的行和列
if (*(*(matrix + i)+j) == 0)
{ //将当前的行和列值置为1
x[i] = 1;
y[j] = 1;
}
}
}
//遍历数组x,若为1将这行的数全置为0
for(int i = 0;i < matrixSize;i++)
{
if(x[i] == 1)
{
for(int j = 0 ; j < *matrixColSize ;j++ )
{
matrix[i][j] = 0;
}
}
}
//遍历数组y,若为1将这列的数全置为0
for(int i = 0; i < *matrixColSize;i++)
{
if(y[i] == 1)
{
for(int j = 0 ; j < matrixSize ;j++ )
{
matrix[j][i] = 0;
}
}
}