力扣 73. 矩阵置零 C语言实现

题目描述:

给定一个 m x n 的矩阵,如果一个元素为 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

 题目链接

解题思路:

由于题目中提示了哈希表,所以本人想到的方法是建立一个哈希表分别用key和value来存储值为0的行和列,遍历矩阵,当某一个值为0时,将该值的行和列存入哈希表中。

然后遍历哈希表,获取key和value值,并将矩阵中对应的位置置为0即可。

代码如下:

typedef struct hashTable
{
    //key 行数 value列数
    int key;
    int value;
    UT_hash_handle hh;
}Hash;
void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
    Hash* loc = NULL;
    int m = matrixSize;
    int n = matrixColSize[0];
    for(int i=0; i<m; ++i)
    {
        for(int j=0; j<n; ++j)
        {
            if(matrix[i][j]==0)
            {
                Hash* new = (Hash*)malloc(sizeof(Hash));
                new->key = i;
                new->value = j;
                HASH_ADD_INT(loc, key, new);
            }
        }
    }
    Hash *s;
    for(s=loc; s != NULL; s=s->hh.next) {
        int r = s->key;
        int c = s->value;
        for(int i=0; i<n; ++i)
        {
            matrix[r][i] = 0;
        }
        for(int i=0; i<m; ++i)
        {
            matrix[i][c] = 0;
        }
    }

}

看了其他解析很明显比自己的想法要高级

实现其中一个比较牛的想法:

将第一行和第一列设为标识列,例如 当 arr[1][2] = 0时,将arr[1][0]和 arr[0][2]置为0。设置完成后分别遍历第一行和第一列,如果有为空的值则分别将其对应的行和列置为0

然而如果不考虑第一列和第一列的话,使用此方法会覆盖第一行和第一列的状态,故先设置两个状态来记录初始时第一行和第一列中是否含有0,然后再遍历其他位置的元素。

void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
    int m = matrixSize;
    int n = matrixColSize[0];
    bool flag1 = false;
    bool flag2 = false;
    
    //判断第一列是否有0 
    for(int i=0; i<m; ++i)
    {
        if(matrix[i][0]==0)
        {
            flag1 = true;
            break;
        }
    }
    //判断第一行是否有0 
    for(int j=0; j<n; ++j)
    {
        if(matrix[0][j]==0){
            flag2=true;
            break;
            }
    }
    //从第二行开始判断
    for(int i=1; i<m; ++i)
    {
        for(int j=1; j<n; ++j)
        {
            if(matrix[i][j]==0)
            {
                matrix[i][0] = 0;
                matrix[0][j] = 0;
            }
        }
    }

    //更新矩阵
    
    //更新其他列
    for(int i=1; i<m; ++i)
    {
        if(matrix[i][0]==0)
        {
            for(int j=1; j<n; ++j)
                matrix[i][j]=0;
        }
    }
    //更新其他行
    for(int i=1; i<n; ++i)
    {
        if(matrix[0][i]==0)
        {
            for(int j=1; j<m; ++j)
                matrix[j][i] = 0;
        }
    }
    //更新第一列
    if(flag1)
    {
        for(int i=0; i<m; ++i)
            matrix[i][0] = 0;
    }
    //更新第一行
    if(flag2)
    {
        for(int i=0; i<n; ++i)
            matrix[0][i] = 0;
    }

}

虽然看起来有点长,但是理解起来还是比较容易,注意更新矩阵的时候要先更新除第一行和第一列以外的元素,否则会更新错误。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值