两个有序数组A、B,长度分别为m、n,找到两个数组的第k个值并返回

来源:互联网 发布:ppt书籍推荐 知乎 编辑:程序博客网 时间:2024/05/16 17:43
/*****************************************************************************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);}

阅读全文
1 0