一、环境说明
- 本文是 LeetCode 350题 : 两个数组的交集 II,使用c语言实现
- 使用哈希思想。
- 测试环境:Visual Studio 2019
二、代码展示
#define MaxSize 1001
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
*returnSize =0 ;
int nums3Size = nums1Size<nums2Size?nums1Size:nums2Size;
int *ans =(int*)calloc(nums3Size,sizeof(int));
int hash[MaxSize] ={0};
for(int i=0;i<nums1Size;i++){
hash[nums1[i]]++;
}
for(int i=0;i<nums2Size;i++){
if(hash[nums2[i]]>0){
hash[nums2[i]]--;
ans[*returnSize]=nums2[i];
(*returnSize)++;
}
}
return ans;
}
三、思路分析
- 一眼哈希,5分钟AC走人,哈希思想见博主的博客设计哈希集合,参照力扣题目描述理解
- 博主使用数组哈希,如果使用链表哈希,空间复杂度应该更低,因为数组哈希的空间复杂度O(|C|),|C|永远是元素大小的上限,而链表的大小可以动态调整。
四、代码分析
五、AC

六、复杂度分析
- 时间复杂度:O(m+n) ,m是nums1的大小,n是nums2的大小,O(m+n)是遍历两个数组的时间复杂度。
- 空间复杂度:O(|C|),O(|C|)是哈希数组的空间复杂度,|C|是输入元素数值的规模,也是哈希数组的大小。