面试OR笔试11——集合交集

来源:互联网 发布:淘宝加盟骗局郑州 编辑:程序博客网 时间:2024/06/05 18:41

题目及要求

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;}


原创粉丝点击