兩個有序數組中的交集


題目:

兩個含有n個元素的有序(非降序)整形數組a和b(數組a和b中都沒有重復元素),求出其共同元素

a = [0,1,2,3,4]

b = [1,3,5,7,9]

那么交集為{1,3}

解法1:很簡單,依次遍歷

vector<int> commonValue1(vector<int>a, vector<int> b){
    vector<int> result;
    if (a.size() < 1 || b.size() < 1)
        return result;
    int i = 0, j = 0;
    while (i < a.size() && j < b.size()){
        if (a[i] == b[j]){
            result.push_back(a[i]);
            i++;
            j++;
        }else if (a[i] > b[j]){
            j++;
        }else{
            i++;
        }
    }
    return result;
}

解法2:假設a很長,b很短,那么再這樣遍歷顯然不是一個很好的方法。可以選擇對b的每個元素都到a中二分查找。

具體而言,對b從后往前遍歷,然后記錄下b元素在a中查找的位置index(不管b中元素在不在)。因為a是增序,所以下次處理b的元素時,就可以縮小a中的查找范圍index-1

//二分查找 返回下標地址,目標不存在則返回left

int binarySearch(vector<int> v,int size,int target){
    //int size = v.size();
    if (size < 1)
        return -1;
    int l = 0, r = size-1;
    while (l <= r){
        int m = (l + r) / 2;
        if (v[m] == target){
            return m;
        }else if (v[m] > target){
            r = m-1;
        }else{
            l = m+1;
        }
    }
    return l;
}
vector<int> commonValue2(vector<int> a, vector<int> b){
    vector<int> result;
    int index = a.size();
    for (int i = b.size()-1; i >= 0; i--){

        index = binarySearch(a,index-1,b[i]);

        if (a[index] == b[i])
            result.push_back(b[i]);
        if (index < 1)
            return result;
    }
    return result;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM