经典C语言算法题之两数组的交集


1、题目描述

给定两个数组,编写一个函数来计算它们的交集。交集中元素不可重复。

示例 1:

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

示例 2:

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

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

2、题目分析

思路很暴力:
第一、双重for循环遍历并对比每个数组元素,缺点时间复杂度高,呈n^2
第二、判断重复元素,每次在赋值前都先遍历已存在的元素和当前待赋值元素,若相等,则不赋值,反之,则赋值
改进点:前人的写法是直接开辟一个长度等于元素较少的那个数组的长度,这样可能会造成内存资源浪费,因为交集元素很可能小于这个长度。
我的做法是:直接把其中任何一个数组作为结果数组,把交集元素放到其中,再定义一个变量来确定交集元素个数,最后在开辟确定大小的内存

第三、数学集合图如下:
数组交集

3、题解代码

代码如下:

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize)
{
    int i,j,flag;
    int size = 0;
    for ( int i = 0 ; i < nums1Size ; i++ ) 
    {
        for ( int j = 0 ; j < nums2Size ; j++ ) 
        {
            if ( nums2[j] == nums1[i] ) 
            {
                flag = 0;
                for ( int k = 0 ; k < size ; k++ )
                {
                    if ( nums1[k] == nums2[j] )   //判重
                        flag = 1;                 //这里不能用continue跳出,我们是要判断它是重复还要处理重复
                }
                if ( !flag ) 
                    nums1[size++] = nums2[j];
            }
        }
    }
    (*returnSize) = size;
    int *ret = (int*)malloc(sizeof(int)*size);
    for(i=0;i<size;i++)
        ret[i]=nums1[i];
    return ret;
}

4、题解心得

1、这道题也花了我不少时间,一直卡在如何去重的问题和怎么开辟内存大小上,我也是参考了他人的代码,总结后写出。
2、缺点还是有的,用for循环太耗时,官方没有C语言解答,但大多数人采用了hash算法。
3、优点嘛,就是节省了一丢丢内存开支。
4、大家如有更好的想法,不妨评论区留言,一起打怪升级。CSDN ID:zhd5120153951
博客域名:https://blog.csdn.net/zhd5120153951

假设集合 A 和 B 分别用数组 a 和 b 表示,数组长度分别为 n 和 m。下面是 C 语言两个集合的交集、并集、差集和环集的代码示例: 1. 交集 交集是指包含在集合 A 和集合 B 中的相同元素。可以通过遍历 a 和 b 数组,将它们中相同的元素添加到结果数组中即可。 ``` int result[100]; int count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i] == b[j]) { result[count++] = a[i]; break; } } } // 输出结果数组 for (int i = 0; i < count; i++) { printf("%d ", result[i]); } ``` 2. 并集 并集是指包含在集合 A 或集合 B 中的所有元素。可以将 a 和 b 数组中的元素全部添加到结果数组中,最后去重即可。 ``` int result[200]; int count = 0; // 将 a 数组中的元素添加到结果数组中 for (int i = 0; i < n; i++) { result[count++] = a[i]; } // 将 b 数组中的元素添加到结果数组中 for (int i = 0; i < m; i++) { result[count++] = b[i]; } // 去重 for (int i = 0; i < count; i++) { for (int j = i + 1; j < count; j++) { if (result[i] == result[j]) { // 将重复的元素删除 for (int k = j; k < count - 1; k++) { result[k] = result[k + 1]; } count--; j--; } } } // 输出结果数组 for (int i = 0; i < count; i++) { printf("%d ", result[i]); } ``` 3. 差集 差集是指包含在集合 A 中但不在集合 B 中的元素。可以遍历 a 数组,将不在 b 数组中的元素添加到结果数组中。 ``` int result[100]; int count = 0; for (int i = 0; i < n; i++) { int flag = 1; for (int j = 0; j < m; j++) { if (a[i] == b[j]) { flag = 0; break; } } if (flag == 1) { result[count++] = a[i]; } } // 输出结果数组 for (int i = 0; i < count; i++) { printf("%d ", result[i]); } ``` 4. 环集 环集是指同时属于集合 A 和集合 B 的元素。可以遍历 a 数组,将同时存在于 a 和 b 数组中的元素添加到结果数组中。 ``` int result[100]; int count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i] == b[j]) { result[count++] = a[i]; break; } } } // 输出结果数组 for (int i = 0; i < count; i++) { printf("%d ", result[i]); } ``` 以上就是 C 语言两个集合的交集、并集、差集和环集的代码示例,希望能够对您有所帮助。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值