4. Median of Two Sorted Arrays

来源:互联网 发布:js同步和异步的理解 编辑:程序博客网 时间:2024/06/05 19:08

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

Example 1:
nums1 = [1, 3]
nums2 = [2]

The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

int main(){    vector<int>nums1;    vector<int>nums2;    int m, n;    while (cin >> m >> n)    {        for (int i = 0; i < m; i++)        {            int x;            cin >> x;            nums1.push_back(x);        }        for (int i = 0; i < n; i++)        {            int x;            cin >> x;            nums2.push_back(x);        }        int flag = (m + n) % 2 == 0? 1 : 0; //个数为偶数,则flag = 1        int mpos = (m + n) / 2;        if (flag)mpos -= 1; //如果为偶数的话,则找两个数中第一个出现时的位置        int count = 0;        int tmp;        size_t i, j;        i = j = 0;        while (i < nums1.size() && j < nums2.size())        {            if (count == mpos+1)break;  // mpos+1是因为count计数要与容器的位置想匹配,因为容器是从0开始的,这样的话,如果是奇数,则count = mpos+1 是,刚好对于容器中的那个元素的位置            if (nums1[i] <= nums2[j])            {                   tmp = nums1[i]; //赋值要在i++前,因为如果i++后再访问容器的话,可能超出容器的范围                i++;                 count++;            }            else            {                       tmp = nums2[j];                j++;                count++;            }        }        if (count == mpos+1)  //以及到达目的位置        {            if (flag) //如果是偶数的话            {                if (i == nums1.size())cout << (tmp + nums2[j])*1.0 / 2 << endl; //此种情况1是,虽然到达了位置,此位置刚好是1容器结束,则第二个数为2容器的元素                else if (j == nums2.size())cout << (tmp + nums1[i])*1.0 / 2 << endl;//此种情况2是,虽然到达了位置,此位置刚好是2容器结束,则第二个数为1容器的元素                else // 此种情况是,都没有到达两个容器结束                {                    if (nums1[i] <= nums2[j])    //如果不做上面情况1/2处理,当遇到时,在此处理会导致访问超出容器的范围                        cout << (tmp + nums1[i])*1.0 / 2 << endl;                    else                        cout << (tmp + nums2[j])*1.0 / 2 << endl;                }               }            else                cout << tmp*1.0 << endl;        }        else //还没有到达目标位置,但是容器1/2中某一个已结束        {            if (i == nums1.size())  //容器1结束            {                tmp = nums2[j + (mpos + 1 - count) - 1];                if (flag)                    cout << (tmp + nums2[j + (mpos + 1 - count)])*1.0 / 2 << endl;                else                     cout << tmp*1.0 << endl;            }            else  //容器2结束            {                tmp = nums1[i + (mpos + 1 - count) - 1];                if (flag)                    cout << (tmp + nums1[i + (mpos + 1 - count)])*1.0 / 2 << endl;                else                    cout << tmp*1.0 << endl;            }        }    }}

分析:
此题还是相对简单,但是考虑的情况比较多,题目中要求的时间复杂度为O(log (m+n)),表明,只有一个循环,且只遍历了(m+n)的一半,故可以想到,不可能是先排好序,所以只能先计算目标位置,然后当遍历到这个位置时,就可以求出值了;

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我身上不来月经怎么办 取环没有取出来怎么办 脸水肿怎么办消得快 鼻子水肿怎么办消得快 勃起后软的快怎么办 手术后纱布掉了怎么办 中国单身的老了怎么办 双眼杯盘比增大,怎么办 出完精子腰疼怎么办 备孕2年没怀孕怎么办 发现怀孕了不想要怎么办 造影后通而不畅怎么办 脑梗病人晚上闹怎么办 两眼视力差距400怎么办 脑血清颗粒吃多怎么办 脸过敏吃了海鲜怎么办 如果qq密码忘了怎么办 qq密码被盗了该怎么办 qq号被别人盗了怎么办 qq不想让别人用怎么办 买了金科的房子怎么办 蟹爪莲叶子耷拉怎么办 金钻的叶子发黄怎么办 金钻叶子发焦黄怎么办 红钻叶子黄了怎么办啊 绿钻叶子黄斑点怎么办 金钻的叶子卷怎么办 金钻叶子有黑斑怎么办 怀孕60天没有胎心胎芽怎么办 单位不给交社保怎么办 公司没给足产假怎么办 小公司不给产假怎么办 机关不给陪产假怎么办 刚人流后又怀孕怎么办 怀孕50天不想要怎么办 生了孩子不想要怎么办 刚怀孕不想要孩子怎么办 怀孕一周不想要孩子怎么办 怀孕了不想要孩子怎么办 怀上二胎后悔了怎么办 50岁怀了二胎怎么办