【发布时间】:2020-11-03 14:33:01
【问题描述】:
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2] 示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[4,9] 注意:
结果中的每个元素出现的次数应与它在两个数组中的显示次数一样多。 结果可以是任何顺序。 跟进:
如果给定的数组已经排序了怎么办?你会如何优化你的算法? 如果 nums1 的大小比 nums2 的大小小怎么办?哪种算法更好? 如果 nums2 的元素存储在磁盘上,并且内存有限,无法一次将所有元素加载到内存中怎么办? 我的解决方案:
int cmp(const void *a,const void *b){
return *(const int *)a - *(const int *)b;
}
int min(int num1,int num2){
if(num1<=num2){
return num1;
}
else{
return num2;
}
}
/*
Note: The returned array must be malloced, assume caller calls free().
*/
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 minimum = min(nums1Size,nums2Size);
int* arr = (int*)malloc(sizeof(int)*minimum);
int i=0,j=0,index=0;
while(i<nums1Size && j<nums2Size){
if(nums1[i]<nums2[j]){
i++;
}
else if(nums2[j]<nums1[i]){
j++;
}
else if(nums1[i]==nums2[j]){
arr[index]=nums1[i];
printf("%d ", arr[index]);
i++;j++;index++;
}
}
for(i=0;i<minimum;i++){
printf("%d ",arr[i]);
}
return arr;
}
当我运行上面的代码时,我得到的输出是 ] 虽然我的逻辑是正确的。上面的 printf 语句给出了正确的答案,如下所示:
知道我的代码中的错误是什么。我不需要任何其他方法。我只希望你帮助我编写代码。先感谢您! 我正在使用 LeetCode。
【问题讨论】: