一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
一 描述
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
提示:
- 1 <= nums1.length, nums2.length <= 1000
- 0 <= nums1[i], nums2[i] <= 1000
二 分析
- 预处理:分别对两个数组用qsort排序,简化处理
- 同时遍历比较两个数组,思路很简单,小的那一方下标++,相等则找到交集
- 这个题里要求的是结果中每个元素唯一,所以需要注意去重,可以在找到相等元素时判断一下当前结果数组里是否已经有这个元素,这里我是另写了一个find函数,感觉还能优化
三 答案
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define max(a, b) ((a) > (b) ? (a) : (b))
int cmp(const void *a, const void *b)
{
return (*(int *)a - *(int *)b);
}
int find(int *nums, int len, int target)
{
for(int i = 0; i < len; i++)
{
if(nums[i] == target)
{
return i;
}
}
return -1;
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
int len = max(nums1Size, nums2Size);
int *res = (int *)malloc(sizeof(int) * len);
qsort(nums1, nums1Size, sizeof(int), cmp);
qsort(nums2, nums2Size, sizeof(int), cmp);
int i = 0;
int j = 0;
int cur = 0;
while(i < nums1Size && j < nums2Size)
{
if(nums1[i] < nums2[j])
{
i++;
}
else if(nums1[i] > nums2[j])
{
j++;
}
else
{
if(find(res, len, nums1[i]) == -1)
{
res[cur++] = nums1[i];
}
i++;
j++;
}
}
*returnSize = cur;
return res;
}
参考
kurisu>>哈希表集合查找 - 两个数组的交集 - 力扣(LeetCode) (leetcode-cn.com)
多解法解两个数组的交集[Persian Leopard] - 两个数组的交集 - 力扣(LeetCode) (leetcode-cn.com)
排序加双指针 or哈希实现,时间O(nlogn) vs O(n),空间O(1) vs 空间O(n) - 两个数组的交集 - 力扣(LeetCode) (leetcode-cn.com)