兩個有序數組A、B,長度分別爲m、n,找到兩個數組的第k個值並返回

/***************************************************************************
**description:兩個有序數組A、B,長度分別爲m、n,找到兩個數組的第k個值並返回
**            要求總的時間複雜度爲O(log(m+n))
***************************************************************************/

#include<iostream>
#include<vector>
using namespace std;

//方法一:按照merge的思想找第k個數據,但merge過程中把重複元素也算在內
//時間複雜度O(m+n),空間複雜度O(1)
int findKthOfTwoSortedArrays_1(const vector<int> &arr1, const vector<int> &arr2, int k)
{
    int index = 0;
    int i = 0;
    int j = 0;
    while (i < arr1.size() || j < arr2.size())
    {
        if (arr1[i] <= arr2[j] || j == arr2.size())
        {
            index++;
            if (k == index)
                return arr1[i];
            i++;
        }
        else if (arr1[i] > arr2[j] || i == arr1.size())
        {
            index++;
            if (k == index)
                return arr2[j];
            j++;
        }
    }

}

//方法二:按照merge的思想找第k個數據,但對重複元素只計一次數
//時間複雜度O(m+n),空間複雜度O(1)
int findKthOfTwoSortedArrays_2(const vector<int> &arr1, const vector<int> &arr2, int k)
{
    int index= 0;
    int i = 0;
    int j = 0;
    while (i < arr1.size() || j < arr2.size())
    {
        if (i == arr1.size())
        {
            if (arr2[j] == arr2[j - 1])
                j++;
            else
            {
                index++;
                if (k == index)
                    return arr2[j];
                j++;
            }
        }
        else if (j == arr2.size())
        {
            if (arr1[i] == arr1[i - 1])
                i++;
            else
            {
                index++;
                if (k == index)
                    return arr1[i];
                i++;
            }
        }
        else
        {
            if (arr1[i] < arr2[j])
            {
                index++;
                if (k == index)
                    return arr1[i];
                i++;
            }
            else if (arr1[i] > arr2[j])
            {
                index ++;
                if (k == index)
                    return arr2[j];
                j++;
            }
            else
               i++;
        }
    }
    return 0;
}

//方法三:假設A和B的元素個數都大於k/2,比較A的第k/2個元素A[k/2-1]和B的第k/2個元素B[k/2-1],有以下三種情況:
//       A[k/2-1] == B[k/2-1]  A[k/2-1]和B[k/2-1]即爲第K元素
//       A[k/2-1] > B[k/2-1]   B[k/2-1]不可能大於A並B的第k個元素,刪除這k/2個元素
//       A[k/2-1] < B[k/2-1]   A[k/2-1]不可能大於A並B的第k個元素,刪除這k/2個元素
//時間複雜度 O(log(m+n)),空間複雜度O(log(m+n))
//但這種方法沒有處理兩個數組中相同元素的問題
int findKth(vector<int>::const_iterator A, int m, vector<int>::const_iterator B, int n, int k)
{
    if (m > n)
        return findKth(B, n, A, m, k);
    if (m == 0)
        return *(B + k - 1);
    if (k == 1)
        return min(*A, *B);

    int posA = min(m, k / 2);
    int posB = k - posA;
    if (*(A + posA - 1) < *(B + posB - 1))
        findKth(A + posA, m - posA, B, n, k - posA);
    else if (*(A + posA - 1) > *(B + posB - 1))
        findKth(A, m, B + posB, n - posB, k - posB);
    else
        return *(A + posA - 1);
}
int findKthOfTwoSortedArrays_3(const vector<int> &arr1, const vector<int> &arr2, int k)
{
    return findKth(arr1.begin(),arr1.size(), arr2.begin(), arr2.size(), k);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章