LeetCode645.错误的集合

文章介绍了一种使用哈希表解决数组中重复和丢失整数的问题,通过遍历数组记录次数,再遍历哈希表找出重复和丢失的数。代码实现中涉及到了动态内存分配和释放,以及memset函数的使用。算法的时间和空间复杂度均为O(n)。
摘要由CSDN通过智能技术生成

一、解题思路

题目给出一个数组,包含1-n的整数,其中只有一个数据出现了重复,因此我们可以利用哈希表的知识,创建一个大小为n+1的数组has【n+1】,遍历记录对应下标出现的次数。

二、解题方法

①数组has【n+1】初始化为0

②遍历数组nums,记录数组值出现的次数,即has【n+1】的下标对应数组值加1

③再遍历一次数组has【n+1】,若has【k】=2,则为重复出现的整数,若has【k】=0,则为丢失的整数。

三、代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
  int* result = (int*)malloc(sizeof(int) * 2);
  int has[numsSize+1];
    memset(has,0,sizeof(has));
    for(int i=0;i<numsSize;i++)
    {
        has[nums[i]]++;
    }
    for(int i=1;i<=numsSize;i++)
    {
        if(has[i]==2)
        result[0]=i;
        if(has[i]==0)
        result[1]=i;
    }
    *returnSize=2;
    return result;
}

四、知识点

①函数传进来一个数的指针int* returnSize,需要在函数体内对他进行赋值,意为返回数组的大小。

②函数内创建的数据在该函数执行完毕之后就会自动释放空间,因此要让主函数能够访问被调用函数创建的数据必须动态分配空间malloc。其中,需要注意的是,malloc返回的指针需要进行类型转换,以匹配变量的类型。另外,分配的内存空间需要在使用完后使用free函数进行释放,以防止内存泄漏。

③memset函数是C语言中的一个标准库函数,用于将一段内存空间填充为指定的值。

其函数原型为:

void *memset(void *s, int c, size_t n);

参数解释:

  1. void *s:指向要填充的内存块的指针;            传入数组名称
  2. int c:要填充的值,通常是一个无符号字符; 
  3. size_t n:要填充的字节数。

函数返回值为指向填充后的内存块的指针。

五、算法分析

①时间复杂度:程序有两个单层循环,O(n)。

②空间复杂度:程序创建了一个大小为n+1的哈希数组,O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值