LeedCode349.两个数组的交集

题目:

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

将两个数组排序后,均是从小到大,那么此时便可利用双指针进行遍历比较

如:nums1元素为1,2,2,1

nums2元素为2,2

经过排序后:

nums1元素为1,1,2,2

nums2元素为2,2

我们只需要index1,index2分别标记,nums1和nums2此时所处的位置

 因为nums1,nums2均是经过排序的,只需要比较双方大小如果,该元素小,则将该元素指向下一位即可,直到其中一个数组循环完毕,如果相等,那么此时要考虑该元素是否已经添加过了,只需要对比是否与上一次存储的元素相等即可,考虑到第一次添加元素,无元素对比,此时只要*returnSize等于0即可

代码如下:

 int cmp(const void * e1,const void * e2)
 {
     return *(int*)e1 - *(int*)e2;
 }
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    qsort(nums1,nums1Size,sizeof(int),cmp);
    qsort(nums2,nums2Size,sizeof(int),cmp);
    int index1 = 0;
    int index2 = 0;
    *returnSize = 0;
    int* ans = (int*)malloc(sizeof(int) * (nums1Size + nums2Size));
    while(index1 < nums1Size && index2 < nums2Size)//其中一个数组遍历完毕即可
    {
        if(nums1[index1] < nums2[index2])
        {
            index1++;
        }
        else if(nums1[index1] > nums2[index2])
        {
            index2++;
        }
        else
        {
            if(!(*returnSize) || nums1[index1]!= ans[*returnSize - 1])//判断是否重复
            {
                ans[*returnSize] = nums1[index1];
                (*returnSize)++;
            }
                index1++;
                index2++;
        }
    }
    return ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值