1 题目及要求
1.1 题目描述
求两个数组的元素交集。
2 解答
2.1 代码
#include<iostream>
#include<set>
#include<vector>
#include<iterator>
#include<algorithm>
using namespace std;
void vPrint(vector<int> &v) {
for (auto i : v) cout << i << ' ';
}
// 方法1: 直接调用STL中的set运算函数
// O( (m+n)*lgm )
vector<int> setIntersection1(const vector<int> &A, const vector<int> &B) {
vector<int> vr;
set_intersection(A.begin(), A.end(), B.begin(), B.end(), back_inserter(vr));
return vr;
}
// 方法2: 一个排序, 然后二分查找 (STL实现)
// 排序 O(mlgm), 查找 O(nlgm), 综合 O( (m+n)*lgm )
vector<int> setIntersection2(vector<int> &A, vector<int> &B) {
sort(A.begin(),A.end());
int low, high, mid;
vector<int> vr;
for (auto b : B) {
low = 0; high = A.size();
while (low < high) {
mid = (low + high) >> 1;
if (A[mid] < b) low = mid + 1;
else high = mid;
}
if (A[low] == b) vr.push_back(b);
}
return vr;
}
// 方法3: 先排序两个数组, 再用迭代器遍历, 相等输出, 较小的舍弃
// 排序 max(O(nlgn),O(mlgm)), 查找 O(m+n), 综合: max(O(nlgn),O(mlgm))
vector<int> setIntersection3(vector<int> &A, vector<int> &B) {
sort(A.begin(), A.end());
sort(B.begin(), B.end());
vector<int> vr;
auto ita = A.begin();
auto itb = B.begin();
while (ita != A.end() && itb != B.end()) {
if (*ita == *itb) {
vr.push_back(*ita);
++ita; ++itb;
}
else if (*ita<*itb) ++ita;
else ++itb;
}
return vr;
}
// 方法4: O(n*m)的方法,直接比较数据然后输出
vector<int> setIntersection4(vector<int> &A, vector<int> &B) {
int na = A.size(), nb = B.size();
vector<int> vr;
for (int k1(0); k1 < na; ++k1)
for (int k2(0); k2 < nb; ++k2)
if (A[k1] == B[k2]) {
vr.push_back(A[k1]);
break;
}
return vr;
}
int main()
{
vector<int> A = { 5,7,9 };
vector<int> B = { 1,2,3,5 };
vPrint(setIntersection1(A, B)); cout << endl;
vPrint(setIntersection2(A, B)); cout << endl;
vPrint(setIntersection3(A, B)); cout << endl;
vPrint(setIntersection4(A, B)); cout << endl;
return 0;
}