leetcode刷题 349 两个数组的交集

题目
给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
说明:

输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。

思路:
首先快速排序,将两个数组进行排序
然后去重,
最后合并两个数组,将相同元素提出。
编译器里运行第二个实例正常但是leetcode报错数组越界,也不知道为什么?

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
void  qusort(int arr[],int start,int end){
    int i,j;
    i=start;
    j=end;
    int tmp;
    tmp=arr[start];
    while(i<j){
        while(i<j&&arr[j]>=tmp){
            j--;
        }
        if(i<j){
            arr[i]=arr[j];
            i++;
        }
        while(i<j&&arr[i]<=tmp){
            i++;
        }
        if(i<j){
            arr[j]=arr[i];
            j--;
        }
    }
    arr[i]=tmp;
    if(start<i){
        qusort(arr,start,j-1);
    }
    if(end>j){
        qusort(arr,i+1,end);
    }
}
void deduplicate(int *nums,int *numsSize){
	int i,j,len=*numsSize;
	int k=0;
	for(i=1;i<len;i++){
		if(nums[i]!=nums[i-1]){
			nums[++k]=nums[i];
		}else{
			*numsSize=*numsSize-1;
		}
	}
} 
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    int len=nums1Size<nums2Size?nums1Size:nums2Size;
    int *arr=(int *)malloc(sizeof(int)*len);
    if(len==0){
        *returnSize=0;
        return arr;
    }
    qusort(nums1,0,nums1Size-1);
    qusort(nums2,0,nums2Size-1);
    deduplicate(nums1,&nums1Size);
    deduplicate(nums2,&nums2Size);
    //合并
    int i=0,j=0,k=0;
    while(i<nums1Size&&j<nums2Size){
        if(nums1[i]==nums2[j]){
            arr[k]=nums1[i];
            i++;k++;j++;
        }
        if(nums1[i]<nums2[j]){
            i++;
        }
        if(nums1[i]>nums2[j]){
            j++;
        }
    }
    *returnSize=k;
    return arr;
}

猜你喜欢

转载自blog.csdn.net/qq_42910523/article/details/103974776
今日推荐