题目1004:Median(查找中位数)

问题来源

  http://ac.jobdu.com/problem.php?pid=1004

问题描述

  给你两个非降序序列,让你求中位数。中位数为第(n+1)/2个数(从0开始计算)。

问题分析

  这个问题有很多种解法,题目放的也很松。
  第一种解法:暴力。直接把两个子串读进一个数组,sort一下取中位数。真是暴力。
  第二种解法:读入两个子串A、B后,再开另外一个数组C,用两个索引依次按次序放入C,再求中位数。
  第三种解法:直接用两个索引p、q指向两个数组的开头,索引的移动可以理解为丢掉前面的数。通过分析我们知道,索引移动次数为(n+m-1)/2,我们要找的中位数就是min(A[p],B[q])。
  注意:解法二三里面有一个坑点,就是可能其中一个索引到头了,这时候只能移动另一个索引了, 最后我们的中位数也是A[p]或者B[q]了,数组越界取值可不行。

参考代码

//
// Created by AlvinZH on 2017/4/24.
// Copyright (c) AlvinZH. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int n,m;
long long a[1000005];
long long b[1000005];

int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
            scanf("%lld",&a[i]);
        scanf("%d",&m);
        for(int i=0;i<m;i++)
            scanf("%lld",&b[i]);

        long long ans;
        int p=0,q=0;
        for(int i=1;i<=(n+m-1)/2;i++)
        {
            if(p==n) q++;
            else if(q==m) p++;
            else if(a[p]<b[q]) p++;
            else q++;
        }
        if(p==n) ans=b[q];
        else if(q==m) ans=a[p];
        else ans=min(a[p],b[q]);
        printf("%lld\n",ans);
    }
}

 

作者: AlvinZH

出处: http://www.cnblogs.com/AlvinZH/

本人Github:https://github.com/Pacsiy/JobDu

本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

posted @ 2017-04-24 23:30  AlvinZH  阅读(700)  评论(0编辑  收藏  举报