开学回归力扣:第二题——349. 两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。

示例 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;
}

猜你喜欢

转载自blog.csdn.net/xiangguang_fight/article/details/114373914