645. 错误的集合

645. 错误的集合

贴个题目:

题目

贴个示例:

示例


解题思路:

哈希表法:

首先来读一下题目:题目意思就是我本来有一个包含1~n的数组,顺序不定,但是呢被一个集合打乱且复制其中一个元素,形成了新的数组
请我们找出这个重复元素和缺失的元素

那么由上可以得出,新建一个数组reNums,长度为2:

int *reNums=(int *)malloc(sizeof(int)*2)
*returnSize=2

然后用哈希表,统计原数组的元素
重复元素个数是2,没有出现的元素个数应该为0
根据这个我们就可以找到那重复元素和缺失元素,分别赋值就行

贴代码:
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findErrorNums(int* nums, int numsSize, int* returnSize){
    int haxarr[numsSize+1];
    //由于是从1~n,因此0是没有用的,长度+1
    memset(haxarr,0,sizeof(haxarr));
    //哈希数组初始化为0
    int *renums=(int *)malloc(sizeof(int)*2);
    *returnSize=2;
    //动态分配返回数组,长度为2
    for(int i=0;i<numsSize;i++)
    //利用哈希表建立映射
    {
        haxarr[nums[i]]++;
    }
    for(int i=1;i<numsSize+1;i++)
    //寻找重复元素和缺失元素
    {
        if(haxarr[i]==2) renums[0]=i;
        else if(haxarr[i]==0) renums[1]=i;
    }
    return renums;
}
性能分析:
时间分析:

有两次循环,因此时间复杂度:O(n)

空间分析:

新建一个哈希数组,因此空间复杂度是:O(n)

排序法和位运算:

这个我就不多说啦,贴上一个官方解答:错误的集合(力扣官方题解)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值