[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

相关推荐

最近和朋友聊天,她说了句让我震惊的话:"我发现我连周末点外卖都开始'最优解'了,一定要赶在高峰期前下单,不然就觉得自己亏了。"这不就是典型的"班味入侵"吗?工作思维已经渗透到生活的方方面面。
小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务