给定两个数组,编写一个函数来计算它们的交集。
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
不考虑输出结果的顺序。
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
/**
* 题目:305.两个数组的交集II
* author:Whywait
* 算法一:排序加归并
* 注意:
出现问题:qsort中compare()函数的越界问题
具体内容:两个int型的变量相减可能会越界
解决方法:将compare()中的减法改为比大小(如下comp函数)
*/
int comp(const void* a, const void* b) {
if ((*(int*)a > * (int*)b)) return 1;
else if ((*(int*)a == *(int*)b)) return 0;
else return -1;
}
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
qsort(nums1, nums1Size, sizeof(int), comp);
qsort(nums2, nums2Size, sizeof(int), comp);
int* c = (int*)malloc(sizeof(int) * 1000);
int p1 = 0, p2 = 0; *returnSize = 0;
while (p1 < nums1Size && p2 < nums2Size) {
if (nums1[p1] < nums2[p2]) p1++;
else if (nums1[p1] > nums2[p2]) p2++;
else {
c[(*returnSize)++] = nums1[p1];
p1++; p2++;
}
}
return c;
}
/**
* 算法二:哈希映射
* 实现方法:使用HashMap跟踪每个数字出现的次数
* 具体实现:
1. 在 HashMap 记录一个数组中的存在的数字和对应出现的次数。
2. 遍历第二个数组,检查数字在 HashMap 中是否存在:
如果存在且计数为正,则将该数字添加到答案并减少其在 HashMap 中的计数。
*/