LeetCode 349题解:两个数组的交集
LeetCode 349题解:两个数组的交集
题目描述
给定两个数组,编写一个函数来计算它们的交集。输出结果中的每个元素必须是唯一的,且不考虑顺序。
解题思路
我们可以使用哈希表来记录第一个数组中出现的元素,然后遍历第二个数组,检查元素是否在哈希表中。如果在,则将其加入结果数组,并从哈希表中移除,以确保结果中的元素唯一。
代码实现
#include <stdio.h>
#include <stdlib.h>
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
// 创建一个大小为1001的数组,用于记录nums1中元素的出现次数
int nums1Cnt[1001] = {0};
// 确定结果数组的大小,取两个数组中较小的一个
int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size;
// 动态分配结果数组的内存,初始化为0
int * result = (int *) calloc(lessSize, sizeof(int));
// 结果数组的索引
int resultIndex = 0;
// 遍历nums1数组,记录每个元素的出现次数
for(int i = 0; i < nums1Size; i ++) {
nums1Cnt[nums1[i]]++;
}
// 遍历nums2数组,检查元素是否在nums1Cnt中出现过
for(int i = 0; i < nums2Size; i ++) {
if(nums1Cnt[nums2[i]] > 0) {
// 如果出现过,则将其加入结果数组
result[resultIndex++] = nums2[i];
// 并将该元素在nums1Cnt中的计数置为0,避免重复加入
nums1Cnt[nums2[i]] = 0;
}
}
// 设置返回结果数组的大小
*returnSize = resultIndex;
// 返回结果数组
return result;
}
// 测试主函数
int main() {
int nums1[] = {1, 2, 2, 1};
int nums2[] = {2, 2};
int nums1Size = sizeof(nums1) / sizeof(nums1[0]);
int nums2Size = sizeof(nums2) / sizeof(nums2[0]);
int returnSize;
int* result = intersection(nums1, nums1Size, nums2, nums2Size, &returnSize);
printf("Intersection: ");
for(int i = 0; i < returnSize; i++) {
printf("%d ", result[i]);
}
printf("\n");
// 释放动态分配的内存
free(result);
return 0;
}
代码解释
-
int nums1Cnt[1001] = {0};
创建一个大小为1001的数组nums1Cnt
,用于记录nums1
中每个元素的出现次数。数组的索引表示元素的值,数组的值表示该元素在nums1
中出现的次数。 -
int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size;
确定结果数组的大小,取两个数组中较小的一个。这是因为结果数组的大小不会超过两个数组中较小的一个。 -
int * result = (int *) calloc(lessSize, sizeof(int));
动态分配结果数组的内存,并使用calloc
将其初始化为0。 -
int resultIndex = 0;
初始化结果数组的索引为0。 -
for(int i = 0; i < nums1Size; i ++) { nums1Cnt[nums1[i]]++; }
遍历nums1
数组,记录每个元素的出现次数。例如,如果nums1[i] = 2
,则nums1Cnt[2]++
。 -
for(int i = 0; i < nums2Size; i ++) { if(nums1Cnt[nums2[i]] > 0) { ... } }
遍历nums2
数组,检查元素是否在nums1Cnt
中出现过。如果出现过,则将其加入结果数组,并将该元素在nums1Cnt
中的计数置为0,以避免重复加入。 -
*returnSize = resultIndex;
设置返回结果数组的大小。 -
return result;
返回结果数组。
测试主函数
在main
函数中,我们定义了两个数组nums1
和nums2
,并调用intersection
函数计算它们的交集。最后,打印结果数组并释放动态分配的内存。
复杂度分析
- 时间复杂度:
O
(
n
+
m
)
O(n + m)
O(n+m),其中
n
n
n和
m
m
m分别是
nums1
和nums2
的长度。我们需要遍历两个数组各一次。 - 空间复杂度:
O
(
1
)
O(1)
O(1),因为我们使用了一个固定大小的数组
nums1Cnt
来记录元素的出现次数。