给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
说明:
输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。
题解:
这一题和两个数组的交集||有些类似,不同的是我们只需要将交集的元素输出一个即可,即交集有多个2时输出一个2即可,这与数学中的集合的互斥性类似。
因此同样有两种方法:
1.哈希表:
这题使用哈希表解决更加容易,我们只需要创建两个哈希表存储数组1,2的出现的数字的个数即可,接着比对两个哈希表,若某个数字存储数量都不为0,则它们是有交集的,直接输出交集数字即可。(这里我默认数字大小范围为0-10000,本来以为力扣的测试用例不能完全通过,最后发现可以。)
代码:
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
int*temp=(int*)malloc(sizeof(int)*nums1Size);
int hash1[10001]={
0};
int hash2[10001]={
0};
for(int i=0;i<nums1Size;i++)
{
hash1[nums1[i]]++;
}
for(int i=0;i<nums2Size;i++)
{
hash2[nums2[i]]++;
}
int index = 0;
for(int i=0;i<=10000;i++)
{
if(hash1[i]==0||hash2[i]==0)
{
continue;
}
else
{
temp[index++]=i;
}
}
*returnSize=index;
return temp;
}
2.排序+双指针:
先计算得出二者全部的交集,接着再创建一个数组,对前者进行选择工作即可,即对重复的数字只要一次。
代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int cmp(int*x,int*y)
{
return *x>*y;
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
int*temp=(int*)malloc(sizeof(int)*nums1Size);
qsort(nums1,nums1Size,sizeof(int),cmp);
qsort(nums2,nums2Size,sizeof(int),cmp);
int i=0;
int j=0;
int index = 0;
while(i<nums1Size&&j<nums2Size)
{
if(nums1[i]==nums2[j])
{
temp[index++]=nums1[i++];
j++;
continue;
}
else
{
if(nums1[i]>nums2[j])
{
j++;
continue;
}
else
{
i++;
continue;
}
}
}
int*temp2=(int*)malloc(sizeof(int)*index);
int index2 = 0;
for(int n=0;n<index;n++)
{
if(n==0)
{
temp2[index2++]=temp[n];
continue;
}
else
{
if(temp[n]==temp[n-1])
{
continue;
}
else
{
temp2[index2++]=temp[n];
continue;
}
}
}
*returnSize=index2;
free(temp);
return temp2;
}