版权声明:=================== 转载请注明出处======================= https://blog.csdn.net/weixin_40583722/article/details/88843150
问题:
给定两个数组,编写一个函数来计算它们的交集。
- 说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。
- 进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
思路及代码:
/* 思路:快速排序(qsort()函数)+双指针遍历 */
// 快排函数(升序)。
int compare(const void* a, const void* b)
{
/*
bug: 若是将 > 改为 -,可能溢出整型范围。
如测试数据: [-2147483648,1],在排序时会导致异常: runtime error: signed integer overflow: -2147483648 - 1 cannot be represented in type 'int' (solution.c)
*/
return *(int*)a > *(int*)b;
}
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize)
{
// 排序。
qsort(nums1, nums1Size, sizeof(int), compare);
qsort(nums2, nums2Size, sizeof(int), compare);
int pos1 = 0, pos2 = 0;
int* result = malloc(sizeof(int)*nums1Size);
*returnSize = 0;
// 双指针。
while (pos1 < nums1Size && pos2 < nums2Size)
{
if (nums1[pos1] < nums2[pos2])
pos1++;
else if (nums1[pos1] > nums2[pos2])
pos2++;
else //只有出现有重复元素时,才会自加两个指针
{
result[(*returnSize)++] = nums1[pos1];
pos1++;
pos2++;
}
}
return result;
}