问题描述
给定两个数组,编写一个函数来计算它们的交集。
示例 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;
}