leetcode刷题--基础数组--两个数组的交集(C)

  1. 给定两个数组,编写一个函数来计算它们的交集。
    示例 1:
    输入: nums1 = [1,2,2,1], nums2 = [2,2]
    输出: [2,2]
    示例 2:
    输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    输出: [4,9]
    说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。我们可以不考虑输出结果的顺序。

思想:(1)将两个数组进行排序O(nlgn)然后依次O(n)比较转存。时间复杂度为O(nlgn),空间复杂度为O(1), 但破坏了原数组。排序函数一般使用各语言自带的函数效率较高,所以这边我默认为两个数组已经排序完成。

int intersect(int* nums1, int nums1Size, int* nums2, int nums2Size){
	int i=0, j=0;
	int count=0;
	if(nums1Size<nums2Size)
        int *intersect = (int *)malloc(nums1Size*sizeof(int));
    else
    	int *intersect = (int *)malloc(nums2Size*sizeof(int));
	while(i == j){
		if(nums1[i] == nums2[j]){
			intersect[count++] = nums1[i];
			i++;
			j++;		
		}	
		else if(nums1[i] > nums2[j])
			j++;
		else
			i++;
	}
	return count;
} 

(2)暴力解法。直接用短数组为基准,将其中的元素一个个拿出来跟长数组中的元素比较,如果相同则存储,并且将该元素所在长数组的位置做标记,避免重复。时间复杂度O(n^2),空间复杂度O(n),如果不想使用空间可以在原长数组中进行修改,改成不可比较的值,这样会破坏原数组。

tersect(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    int count = 0;
    if(nums1Size<nums2Size){
        printf("1");
        int *flag = (int *)malloc(nums2Size*sizeof(int));
        int *intersect = (int *)malloc(nums1Size*sizeof(int));
        for(int j=0; j<nums2Size; j++){
            flag[j] = 0;
        }
        for(int i=0; i<nums1Size; i++){
            for(int j=0; j<nums2Size; j++){
                if((flag[j]==0) && (nums1[i] == nums2[j])){
                    intersect[count] = nums1[i];
                     printf("%d", intersect[count]);
                    count++;
                    flag[j] = 1;
                }
            }
        }
    }            
    else{
        int *flag = (int *)malloc(nums1Size*sizeof(int));
        int *intersect = (int *)malloc(nums2Size*sizeof(int));
        for(int i=0; i<nums1Size; i++){
            flag[i] = 0;
        }
        for(int j=0; j<nums2Size; j++){
            for(int i=0; i<nums1Size; i++){
                if((flag[i]==0) && (nums1[i] == nums2[j])){
                    intersect[count] = nums2[j];
                    printf("%d", intersect[count]);
                    count++;
                    flag[i] = 1;
                }
            }
        }
    } 
    return count;                                       
}

(3)哈希表。把两个数组A和B都遍历到一个新的数组里,然后在统计重复的数字即可,这个时间复杂度就是O(n),空间复杂度O(m)。这个要求数组内数字的范围是已知并且不是很大。同样的在JAVA里面有HashMap。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值