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)
排序法和位运算:
这个我就不多说啦,贴上一个官方解答:错误的集合(力扣官方题解)