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