LeetCode 算法题目—两个数组的交集 II

题目如下:
给定两个数组,写一个方法来计算它们的交集。

例如:
给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].

注意:

输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。

先讲一下我的情况,新入坑的自学者,代码菜鸟级别,目前只会写C语言,所以我的题目都是用C语言写的哈,而且代码会有很多可以优化的地方,这里就抛砖引玉,仅供大家参考了。

如果选择用C语言写,LeetCode还有两个隐含的题目要求:Return an array of size *returnSize. The returned array must be malloced, assume caller calls free().——注释里的这句话的意思是,要求最后要将输出的数组的长度返回到returnSize的变量中,要用malloc函数动态创建数组,调用者会释放内存,不用创建者释放,如果不按这两个要求,输出数组是空的。

然后讲一下我对这题的思路,求两个数组的交集,并且重复的数字也要包含,所以可以依次遍历数组1,先判断一下元素1是否已经包含在新数组里,如果包含,证明已经统计过了,跳出循环,如果没有,分别求出元素1在数组1和数组2的个数,判断如果数组2也包含元素1,比较个数,按个数少的数量将元素1依次写进新数组。

这里有一个问题,你怎么知道每次插入数组的位置呢?我们就要用标记记录每次插入的元素数量,这样下一次插入元素就知道从哪里开始了。

再讲一下踩的一个坑,用malloc函数动态创建数组,系统会自动将数组所有元素初始化为0,所以0的情况要先处理。

具体来看一下代码:

/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    if(nums1Size <= 0 || nums2Size <= 0){
        return 0;
    }
    int newArrSize = nums1Size+nums2Size;
    int *newArr = (int *)malloc(sizeof(int) * newArrSize);
    int cnt3=0;//这是插入数组位置的标记,也就是最后生成交集数组的长度
    int zero1=0;//这里开始,先求出0的交集情况
    int zero2=0;
    for (int i=0; i < nums1Size; i++){
        if (nums1[i] == 0){
            zero1 += 1;
        }
    }
    for (int i=0; i < nums2Size; i++){
        if (nums2[i] == 0){
            zero2 += 1;
        }
    }
    if (zero1 >= zero2 && zero2 != 0){
        for (int i=0; i<zero2; i++){
            newArr[i] = 0;
        }
        cnt3 = zero2;
    }
    if (zero1 < zero2 &&zero1 != 0){
        for (int i=0; i<zero1; i++){
            newArr[i] = 0;
        }
        cnt3 = zero1;
    }

    for (int i=0; i < nums1Size; i++){ //这里开始遍历数组1
        int num=nums1[i];
        int flag=0;
        for (int a=0; a <= cnt3; a++){
            if (newArr[a] == num ){
                flag = 1;
                break;//如果新数组已经存在这个元素,就跳出循环;
            }
        }
        if(flag == 1){
            continue;
        }
        //下面开始插入相同的元素
        int cnt1=0;
        for (int j=0; j < nums1Size; j++){
            if (nums1[j] == num){
                cnt1++;
            }
        }
        int cnt2=0;
        for (int h=0; h < nums2Size; h++){
            if (nums2[h] == num){
                cnt2++;
            }
        }
        if (cnt2 >= cnt1){
            for (int k=0; k < cnt1; k++){
                newArr[cnt3+k]=num;
            }
            cnt3 = cnt3+cnt1;
        }
        if (cnt2 < cnt1 && cnt2 > 0){
            for (int k=0; k < cnt2; k++){
                newArr[cnt3+k]=num;
            }
            cnt3 = cnt3+cnt2;
        }
    }
    *returnSize = cnt3;
    return newArr;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值