两个数组的交集
Intersection of Two Arrays
解
C语言没有set,没有内置hash,所以这里用了最简单的方法:排序、去重、比较
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int max(int a, int b)
{
return a > b ? a : b;
}
int comp(const void *a, const void *b)
{
return *(int *)b - *(int *)a;
}
void removeDuplicate(int *nums, int *numsSize)
{
int size = *numsSize, i;
int j = 0, k = 0;
if (!nums || *numsSize <= 0){
return;
}
int temp[size];
if(size == 1){
return;
}
for (i = 0; i < size - 1; i++)
{
if (nums[i] - nums[i + 1]){
temp[k++] = nums[i];
}
}
temp[k++] = nums[size - 1];
*numsSize = k;
for (i = 0; i < *numsSize; i++)
{
nums[i] = temp[i];
}
return;
}
int *intersection(int *nums1, int nums1Size, int *nums2, int nums2Size, int *returnSize)
{
int i, j, k, len, *ret;
*returnSize = 0;
len = max(nums1Size, nums2Size);
if(len <= 0){
len = 1;
}
ret = (int *)malloc(len * sizeof(int));
if (!nums1 || nums1Size < 0||!nums2 || nums2Size < 0){
return ret;
}
qsort(nums1, nums1Size, sizeof(nums1[0]), comp);
qsort(nums2, nums2Size, sizeof(nums2[0]), comp);
removeDuplicate(nums1, &nums1Size);
removeDuplicate(nums2, &nums2Size);
for (i = 0, j = 0, k = 0; i < nums1Size && j < nums2Size;){
if (nums1[i] == nums2[j]){
ret[k++] = nums1[i];
i++;
j++;
}
else if (nums1[i] < nums2[j]){
j++;
}
else{
i++;
}
}
*returnSize = k;
//printf("k:%d\n", k);
return ret;
}
结果