c_cpp 交集,两个排序数组的并集
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 交集,两个排序数组的并集相关的知识,希望对你有一定的参考价值。
// Intersection has two solutions.
// first, if M=sizeof(A) is far more less than N=sizeof(B), use binary search. O(MlogN);
// second, if M ~= N (almost equal size), use two pointers, linearly scan. O(M+N).
// note, do not forget the case if has duplications
vector<int> intersection(vector<int> &A, vector<int> &B) {
vector<int> res;
int i = 0, j = 0;
while(i < A.size() && j < B.size()) {
if(A[i] < B[j])
i++;
else if(A[i] > B[j])
j++;
else { // equal
res.emplace_back(A[i]);
int val = A[i];
while(i<A.size() && A[i] == val) i++; // gist handle duplications
while(j<B.size() && B[j] == val) j++;
}
}
return res;
}
vector<int> union(vector<int> &A, vector<int> &B) {
if(A.empty()) return B;
if(B.empty()) return A;
vector<int> res; // 似乎用set会比较好,能处理重复
int i = 0, j = 0;
while(i < A.size() && j < B.size()) {
if(A[i] < B[j])
res.emplace_back(A[i++]);
else if(A[i] > B[j])
res.emplace_back(B[j++]);
else { // equal
res.emplace_back(A[i]);
i++;
j++;
}
}
while(i < A.size()) res.emplace_back(A[i++]); // easy to forget
while(j < B.size()) res.emplace_back(B[j++]); // easy to forget
return res;
}
以上是关于c_cpp 交集,两个排序数组的并集的主要内容,如果未能解决你的问题,请参考以下文章
ES6数组:两个数组或数组对象取并集、交集、差集
asp.net两个数组的并集
如何求两个数组的交集??
用linq做数组取并集
PHP数组的并集交集差集
ES6 Set求两个数组的并集交集差集;以及对数组去重