两个数组的交集 II
Intersection of Two Arrays II
解
方法一:暴力法
为了节省时间,我们搜索较小的数组
int comp(const void *a, const void *b)
{
int *c = (int *)a, *d = (int *)b;
if(*c > *d){
return 1;
}
if(*c == *d){
return 0;
}
return -1;
}
int BinarySearch(int *a,int x,int len)
{
int left = 0, right = len - 1;
int mid;
while(left <= right){
mid = (left + right) / 2;
if(x < a[mid]){
right = mid - 1;
}else if(x > a[mid]){
left = mid + 1;
}else{
return mid;
}
}
return -1;
}
int *intersect(int *nums1, int nums1Size, int *nums2, int nums2Size, int *returnSize)
{
int size = nums1Size > nums2Size ? nums1Size : nums2Size;
int i, j, index = 0;
int *ret = (int *)malloc(sizeof(int) * size);
if(nums2Size > nums1Size){
int *temp = nums2;
nums2 = nums1;
nums1 = temp;
int tem = nums2Size;
nums2Size = nums1Size;
nums1Size = tem;
}
qsort(nums2, nums2Size, sizeof(nums2[0]), comp);
for (i = 0; i < nums1Size; i++){
int key = BinarySearch(nums2, nums1[i], nums2Size);//二分搜索
if(key != -1){
ret[index++] = nums1[i];
for (j = key; j < nums2Size - 1; j++){
nums2[j] = nums2[j + 1];
}
nums2Size--;
}
if( !nums2Size ){
break;
}
}
*returnSize = index;
return ret;
}
结果
结果还是蛮可以的。
方法二:双指针
int comp(const void *a, const void *b)
{
int *c = (int *)a, *d = (int *)b;
if(*c > *d){
return 1;
}
if(*c == *d){
return 0;
}
return -1;
}
int *intersect(int *nums1, int nums1Size, int *nums2, int nums2Size, int *returnSize)
{
int i = 0, j = 0;
int size = nums1Size > nums2Size ? nums1Size : nums2Size;
int index = 0;
int *ret = (int *)malloc(sizeof(int) * size);
qsort(nums1, nums1Size, sizeof(nums1[0]), comp);
qsort(nums2, nums2Size, sizeof(nums2[0]), comp);
while(i < nums1Size && j < nums2Size){
if(nums1[i] == nums2[j]){
ret[index++] = nums1[i];
i++;
j++;
}else if(nums1[i] < nums2[j]){
i++;
}else{
j++;
}
}
*returnSize = index;
return ret;
}
结果
方法三:哈希表
因为C语言hash比较麻烦,所以这里用C++
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> ret;
if(nums1.size() > nums2.size()){ //搜索较小的
swap(nums1, nums2);
}
map<int, int> a;
for (int i = 0; i < nums2.size(); i++){ //初始化
if( !a.count(nums2[i]) ){
a.insert(map<int, int>::value_type(nums2[i], 1));
}else{
a[nums2[i]]++;
}
}
for (int i = 0; i < nums1.size(); i++){
if(a[nums1[i]] != 0){
ret.push_back(nums1[i]);
a[nums1[i]]--;
}
}
return ret;
}
};
结果