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求两个数组的并集交集差集;以及对数组去重