LeetCode笔试题 Intersection of Two Arrays(求两个数组的交集)

问题描述

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]

示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]

说明:

1.对数组进行排序,在进行比较。 

  • 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
  • 我们可以不考虑输出结果的顺序
  • /*
    思路:先将两个数组排序
    	  然后从两个数组起始位置开始比较
    	  相等就将相等元素存入result中,同时两个数组下标++
    	  谁小谁的下标就++
    */
    int Compare(const void *num1, const void *num2)
    {
    	return *(int*)num1 - *(int*)num2;
    }
    void intersect(int *arr1,int len1,int *arr2,int len2, vector<int>&vec)
    {
    	//给两个数组由小到大排序
    	qsort(arr1, len1, sizeof(int), Compare);
    	qsort(arr2, len2, sizeof(int), Compare);
    	int i = 0;
    	int j = 0;
    	//比较
    	while (i < len1 &&j < len2)
    	{
    		if (arr1[i] > arr2[j])
    		{
    			j++;
    		}
    		else if (arr1[i] < arr2[j])
    		{
    			i++;
    		}
    		else
    		{
    			vec.push_back(arr1[i]);
    			i++;
    			j++;
    		}
    	}
    }
    int main()
    {
    	int arr1[] = { 4,9,5 };
    	int arr2[] = { 9,4,9,8,4 };
    	int len1 = sizeof(arr1) / sizeof(arr1[0]);
    	int len2 = sizeof(arr2) / sizeof(arr2[0]);
    	vector<int>result;
    	intersect(arr1, len1,arr2,len2, result);
    
    	for (int val : result)
    	{
    		cout << val << " ";
    	}
    	cout << endl;
    
    	getchar();
    	return 0;
    }

2.利用STL容器(multiset) 

void intersect(vector<int>&arr1,vector<int>&arr2,vector<int>&result)//注意这里参数传的是地址
{
	//定义两个multiset,分别存arr1与arr2
	multiset<int>mu1;
	multiset<int>mu2;
	for (int i = 0; i < arr1.size(); i++)
	{
		mu1.insert(arr1[i]);
	}
	for (int i = 0; i < arr2.size(); i++)
	{
		mu2.insert(arr2[i]);
	}
	//遍历两个容器,比较两个大小,相等push进result中 
	//谁小谁++;
	auto it1 = mu1.begin();
	auto it2 = mu2.begin();
	while (it1 != mu1.end() && it2 != mu2.end())
	{
		if (*it1 > *it2)
		{
			it2++;
		}
		else if (*it1 < *it2)
		{
			it1++;
		}
		else
		{
			result.push_back(*it1);
			it1++;
			it2++;
		}
	}
}
int main()
{
	vector<int>arr1 = { 8,6,1,3,6,4,3,5,4,6 };
	vector<int>arr2 = { 5,6,9,4,2,3,8,4 };
	vector<int>result;
	intersect(arr1, arr2, result);
	for (int val : result)
	{
		cout << val << " ";
	}
	cout << endl;
	getchar();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zhangfei5354/article/details/89743166