[PAT解题报告] Median

两个有序数组的中位数是个经典的问题,但是本题对时间要求不高,所以可以用归并排序的方法来做,所以就很简单了。归并排序找到第k个元素就可以了。时间复杂度是O(k)其中k是(na + nb)  / 2。还有题目里说的long,我还是用了long long。
代码:

#include <cstdio>
#include <string>
#include <cstring>
using namespace std;

long long a[1000006], b[1000006];

int main() {
int na,nb;
    scanf("%d",&na);
    for (int i = 0; i < na; ++i) {
        scanf("%lld",a + i);
    }
    scanf("%d", &nb);
    for (int j = 0; j < nb; ++j) {
        scanf("%lld", b + j);
    }
    for (int i = 0, j = 0, k = 0, c = 0,want = (na + nb - 1) >> 1; (i < na) || (j < nb); ++k) {
        if (i >= na) {
            c = 1;
        }
        else if (j >= nb) {
            c = 0;
        }
        else {
            c = (a[i] < b[j])?0:1;
        }
        if (c == 0) {
            if (k == want) {
                printf("%lld\n",a[i]);
                break;
            }
            ++i;
        }
        else {
            if (k == want) {
                printf("%lld\n",b[j]);
                break;    
            }
            ++j;
        }
    }
    return 0;
}
原题链接: http://www.patest.cn/contests/pat-a-practise/1029
全部评论
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn =2000010; LL numa[maxn]; int main() {     int lena,lenb;     ios::sync_with_stdio(false);     cin>>lena;     for(int i=1;i<=lena;i++) cin>>numa[i];     cin>>lenb;     for(int i=lena+1;i<=lenb+lena;i++) cin>>numa[i];     sort(numa+1,numa+lena+lenb+1);     cout<<numa[(lena+lenb+1)/2]<<endl; }
点赞 回复 分享
发布于 2017-10-13 22:03

相关推荐

想去夏威夷的小哥哥在度假:5和6才是重点
点赞 评论 收藏
分享
10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务