一、题目描述
二、思路
因为由上图中实例1,输出为[2],而不是[2,2]可知,说明交集仅包含元素值,不用考虑个数,因此主要解题步骤可以分为两步:计算nums1数组中各个元素的个数、遍历nums2数组去判断是否有交集。
三、解题过程
-
初始化输出数组以及计数数组
int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size;
int* result = (int*)calloc(lessSize,sizeof(int));
int count[1000] = { 0 };
int returnIndex = 0;
-
对nums1数组中元素进行计数
int i = 0;
for(i = 0; i < nums1Size; i ++) count[nums1[i]] ++;
-
对nums2数组中元素进行判断
- 若nums2中元素在count数组中个数大于零,则将该元素放到输出数组中,同时对count数组中该元素个数清零,以免后续重复判断:
for(i = 0; i < nums2Size; i ++) {
if(count[nums2[i]] > 0) {
result[returnIndex] = nums2[i];
returnIndex ++;
count[nums2[i]] = 0;
}
}
-
返回输出数组大小以及输出数组
* returnSize = returnIndex;
return result;
四、代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size;
int* result = (int*)calloc(lessSize,sizeof(int));
int count[1000] = { 0 };
int returnIndex = 0;
int i = 0;
for(i = 0; i < nums1Size; i ++) count[nums1[i]] ++;
for(i = 0; i < nums2Size; i ++) {
if(count[nums2[i]] > 0) {
result[returnIndex] = nums2[i];
returnIndex ++;
count[nums2[i]] = 0;
}
}
* returnSize = returnIndex;
return result;
}
时间复杂度:O(m+n),空间复杂度:O(n)