题目
给定两个数组,编写一个函数来计算它们的交集。
示例 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;
}