Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, return [2, 2]
.
Note:
- Each element in the result should appear as many times as it shows in both arrays.
- The result can be in any order.
代码:
void qSort(int* nums, int left, int right)
{
if (left >= right) return;
int l = left;
int r = right;
int pivot = nums[l];
while(l < r)
{
while (l < r && nums[r] >= pivot) { r--;}
if (r > l) nums[l++] = nums[r];
while(l < r && nums[l] < pivot){ l++; }
if (l < r) nums[r--] = nums[l];
}
nums[l] = pivot;
qSort(nums, left, l-1);
qSort(nums, r+1, right);
}
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
qSort(nums1, 0, nums1Size - 1);
qSort(nums2, 0, nums2Size - 1);
int count = 0;
int* res = NULL;
if (nums1Size < nums2Size) {
res = (int*)malloc(nums1Size * sizeof(int));
}
else {
res = (int*)malloc(nums1Size * sizeof(int));
}
int i = 0, j = 0;
while(i < nums1Size && j < nums2Size) {
while(i < nums1Size && nums1[i] < nums2[j]) {i++;}
if (i >= nums1Size) break;
while(j < nums2Size && nums2[j] < nums1[i]) {j++;}
if (j >= nums2Size) break;
if (nums1[i] == nums2[j]) {
res[count++] = nums1[i];
i++;
j++;
}
}
int *result = (int*)malloc(count * sizeof(int));
for (i = 0; i < count; ++i){
result[i] = res[i];
}
*returnSize = count;
return result;
}