计算数组交集

Posted 巧合

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算数组交集相关的知识,希望对你有一定的参考价值。

两个数组计算交集

题目描述

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

示例

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

示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]

说明:
    输出结果中的每个元素一定是唯一的。
    我们可以不考虑输出结果的顺序。

方法

方法一:bitmap + 与运算

1.创建两个bitmap:bitmap1、bitmap2,分别用 nums1、nums2 来初始化 bitmap1、bitmap2:将 nums1中的值作为 bitmap1 的索引,并将该索引对应的值置为 1;bitmap2 同理
2.创建一个 result数组,用于保存结果
3.bitmap1 和 bitmap2 逐个元素进行 与运算,若 与运算结果为1,则将值赋值给 result,同时 (*resultSize)++,result中为 1 的元素就是交集,*resultSize就是交集元素个数
缺点:三个大数组,空间开销大

方法二:排序 + 比较

1.qsort对两个数组排序
2.创建result数组,大小为 nums1Size 和 nums2Size 中较小的那个
2.逐个比较 nums1[i]、nums2[j]中的元素
    若想等 并且 nums1[i] 不等于 prev,则将 nums1[i] 保存至result中,i++,j++
    若不相等,将 nums1[i]、nums2[j] 中较小的值得索引向后偏移

代码

bitmap + 与运算

#define MAX 2048

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    char *map1 = NULL;
    char *map2 = NULL;
    int index = 0;
    int *result = NULL;
    
    *returnSize = 0;

    map1 = (char *)malloc(MAX*sizeof(char));
    if (NULL == map1)
    {
        return NULL;
    }
    memset(map1, 0x00, MAX);

    map2 = (char *)malloc(MAX*sizeof(char));
    if (NULL == map2)
    {
        free(map1);
        return NULL;
    }
    memset(map2, 0x00, MAX);

    for(index = 0; index < nums1Size; index++)
    {
        map1[nums1[index]] = 1;
    }

    for(index = 0; index < nums2Size; index++)
    {
        map2[nums2[index]] = 1;
    }

    result = (int *)malloc(sizeof(int)*MAX);
    if (NULL == result)
    {
        free(map1);
        return NULL;
    }
    memset(result, 0x00, MAX);

    for (index = 0; index < MAX; index++)
    {
        if (map1[index] & map2[index])
        {
            result[*returnSize] = index;
            (*returnSize)++;
        }
    }
    free(map1);
    free(map2);
    return result;
}

排序

int *cmp(const void * a, const void * b)
{
    return *(int *)a - *(int *)b;
}

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    int *result = NULL;
    int i = 0;
    int j = 0;
    int pre;    /* 这里不能初始化为 0,否则遇到元素值为 0 的时候会出错 */
    *returnSize = 0;

    result = (int *)malloc(sizeof(int) * (nums1Size < nums2Size ? nums1Size : nums2Size));
    if (NULL == result)
    {
        return NULL;
    }

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

    while (i < nums1Size && j < nums2Size)
    {
        if (nums1[i] == nums2[j] && pre != nums1[i])
        {
            result[(*returnSize)++] = nums1[i];
            pre = nums1[i];
            i++;
            j++;
        }
        else
        {
            nums1[i] < nums2[j] ? i++ : j++;
        }
    }

    return result;
}

int main()
{
    
    return 0;
}

以上是关于计算数组交集的主要内容,如果未能解决你的问题,请参考以下文章

在 O(mlogn) 时间内计算两个未排序数组的并集和交集

计算数组交集

js取两个数组的交集|差集|并集|补集|去重示例代码

如何计算 php 中未知数量数组的交集?

Leetcode练习(Python):第350题:两个数组的交集 II:给定两个数组,编写一个函数来计算它们的交集。

Leetcode练习(Python):第350题:两个数组的交集 II:给定两个数组,编写一个函数来计算它们的交集。