sundeepblue
3/20/2014 - 7:48 PM

intersection, union of two sorted arrays

intersection, union of two sorted arrays

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