leetcode笔记之[349. 两个数组的交集]

47 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

一、题目描述:

349. 两个数组的交集 - 力扣(LeetCode)

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。   示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

  提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

二、思路分析:

说明:ar表示最后要输出的数组(即两数组的交集),k用来记录ar的长度,hush表示一个哈希表

第一步:遍历nums1,利用hush表,将nums1数组中的每个数映射到hush表的位置,并标记为1。即:hush[nums1[i]]=1;

第二步:遍历nums2,找到数组nums2里的值对应的hush表的位置,如果hush表在之前已经标记为1了,那么说明数组nums1中有这个数,就把这个数存入ar数组,并且一定一定一定要把hush[nums2[i]]置0,这样的话,才能保证nums2中的重复数字,不会再ar中出现。 注:如果没有把hush[nums2[i]]置0,那么实例1将输出[2,2]。

三、AC 代码:



/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp(const void *p1, const void *p2)
{
    //qsort 回调函数
    return *(int *)p1 - *(int *)p2;
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    
    int n = (nums1Size < nums2Size) ? nums1Size : nums2Size; //ret数组最多内存
    int *ret = (int*)malloc(sizeof(int) * n);
    memset(ret, 0, n * sizeof(int));

    //排序
    qsort(nums1, nums1Size, sizeof(int), cmp);
    qsort(nums2, nums2Size, sizeof(int), cmp);

    //定义两个数组的指针,以及ret的指针
    int p1 = 0, p2 = 0;
    int rp = 0;
    while(p1 < nums1Size && p2 < nums2Size)
    {
        if(nums1[p1] == nums2[p2])//数相同
        {
            if(!rp)
            {
                ret[rp] = nums1[p1];
                rp ++;
            }
            else if(ret[rp - 1] != nums1[p1]) //该数已经存过了,由于经过排序,只需要查最近一个即可
            {
                ret[rp ++] = nums1[p1];
            }
            p1 ++;  //指针同时移动
            p2 ++;
        }  
        else
        {
            if(nums1[p1] > nums2[p2]) //走得慢的指针追赶,若为降序排序需要反过来
            {
                p2 ++;
            }
            else
            {
                p1 ++;
            }
        }  
    }
    
    *returnSize = rp;
    return ret;
}

范文参考

遍历其中长度小的数组,遇到前后两个相同的数就跳过前面那个重复的数,然后用遍历到的数当target值,到长度较长的数组中进行二分查找 - 两个数组的交集 - 力扣(LeetCode)