Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, return [2]
.
Note:
- Each element in the result must be unique.
- The result can be in any order.
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int pivot_(int *nums, int low, int high) {
int pivotkey = nums[low];
while(low < high) {
while(low < high && pivotkey <= nums[high]) {
--high;
}
nums[low] = nums[high];
while(low < high && pivotkey >= nums[low]) {
++ low;
}
nums[high] = nums[low];
}
nums[low] = pivotkey;
return low;
}
void quickSort(int *nums, int from, int to) {
if (from < to){
int pivot = pivot_(nums, from, to);
quickSort(nums, from, pivot - 1);
quickSort(nums, pivot + 1, to);
}
}
int single_nums(int *nums, int numsSize){
int i;
int j;
if(numsSize == 0) {
return 0;
}
quickSort(nums, 0, numsSize - 1);
for (i = 1, j = 0; i < numsSize; ++i) {
if (nums[i] != nums[j]) {
nums[++j] = nums[i];
}
}
return j + 1;
}
int min(int a, int b) {
return a < b ? a: b;
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
int len1 = single_nums(nums1, nums1Size);
int len2 = single_nums(nums2, nums2Size);
int *res = (int *) malloc(sizeof(int) * min(len1, len2));
int i = 0;
int j = 0;
int inds = 0;
while(i < len1 && j < len2) {
if (nums1[i] == nums2[j]) {
res[inds++] = nums1[i];
++i;
++j;
} else if (nums1[i] < nums2[j]) {
++i;
} else {
++j;
}
}
*returnSize = inds;
return res;
}
python代码
class Solution(object):
def intersection(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
nums1 = set(nums1)
nums2 = set(nums2)
return list(nums1 & nums2)