zoukankan      html  css  js  c++  java
  • 题目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
    ",ans);
        }
    }

    作者: AlvinZH

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

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

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

  • 相关阅读:
    【作业】Python面向对象
    Python使用使用第三方源(国内源:豆瓣)下载包文件 超快!!!
    【案例】Python
    【个人笔记】Python
    定义函数相关内容
    列表,for循环相关.
    while应用和函数学习
    斗地主发牌器
    字符串索引切片.
    随机生成20以内加减法,5次答题并统计正确和错误题数
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/6759765.html
Copyright © 2011-2022 走看看