2011-42

56 阅读1分钟

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

/*
【2011统考真题】42
一个长度为L(L>=1)的升序序列 S,处在第⌈ L/2 ⌉个位置的数称为 S 的中位数。
例如,若序列S(1)=(11,13,15,17,19),则S(1)的中位数是15,
两个序列的中位数是含它们所有元素的升序序列的中位数。
例如,若S(2)=(2,4,6,8,20),则S(1)和S(2)的中位数是11。
现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,
找出两个序列A和B的中位数。
要求:
​1) 给出算法的基本设计思想。
​2) 根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。
​3) 说明你所设计算法的时间复杂度和空间复杂度。
*/
/*
11 13 15 17 19
2 4 6 8 20
2 4 6 8 11 13 15 17 19 20

*/

int mid_num(vector<int> a, vector<int> b)
{
    int l = a.size(), i = 0, j = 0;
    int mid = 0, count = 0;
    while (i < l && j < l)
    {
        if (a[i] < b[j])
        {
            count++;
            if (count == l)
                mid = a[i];
            i++;
        }
        else
        {
            count++;
            if (count == l)
                mid = b[j];
            j++;
        }
        if (count >= l)
            return mid;
    }
    return 0;
}
int main()
{
    vector<int> a = {11, 13, 15, 17, 19};
    vector<int> b = {2, 4, 6, 8, 20};
    int ret = mid_num(a, b);
    cout << "mid number = " << ret << endl;
    return 0;
}