leetcode-初级- 两个数组的交集 II

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

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

注意:

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

跟进:

  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
  • 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    int i,j,len2;
    int *numsdep,size;
    (*returnSize)=0;
    len2=nums2Size-1;
    size=nums1Size<nums2Size?nums1Size:nums2Size;
    numsdep=(int*)malloc(size*sizeof(int));
    int index=0;
    for(i=0;i<nums1Size;i++)
        for(j=0;j<=len2;j++){
            if(nums1[i]==nums2[j])
            {               
                nums2[j]=nums2[len2];
                len2--;  /**此处应该将数组2中与数组1相交的部分去掉,简单方法是将末尾元素提前,遍历长度减1**/
                numsdep[index++]=nums1[i];
                (*returnSize)++;
                break;
            }
        }
    return numsdep;
}

时间较快的一种答案,引自https://leetcode-cn.com/submissions/detail/4390430/

int cmp(const void * a, const void * b)
{
    if(*(int *)a == INT_MIN)
        return (*(int *)a);
    else if (*(int *)b == INT_MIN)
        return 1;
    else
        return (*(int*)a - *(int*)b);
}
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    qsort(nums1,nums1Size,sizeof(int),cmp);
    qsort(nums2,nums2Size,sizeof(int),cmp);
    int len = nums1Size < nums2Size ? nums1Size : nums2Size;
    int * res = malloc(sizeof(int)*len);
    int length = 0;
    int i = 0 ,j = 0;
    while(i<nums1Size && j<nums2Size)
    {
        if(nums1[i]>nums2[j])
            j++;
        else if(nums1[i]<nums2[j])
            i++;
        else if(nums1[i] == nums2[j])
        {
            res[length++] = nums1[i];
            i++;
            j++;
        }
    }
    *returnSize = length;
    return res;    
}

猜你喜欢

转载自blog.csdn.net/mouthful/article/details/81122088