九度 OJ 1004

面试算法题 专栏收录该内容
67 篇文章 0 订阅
题目1004:Median

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:12947

解决:3554

题目描述:

    Given an increasing sequence S of N integers, the median is the number at the middle position. For example, the median of S1={11, 12, 13, 14} is 12, and the median of S2={9, 10, 15, 16, 17} is 15. The median of two sequences is defined to be the median of the non-decreasing sequence which contains all the elements of both sequences. For example, the median of S1 and S2 is 13.
    Given two increasing sequences of integers, you are asked to find their median.

输入:

    Each input file may contain more than one test case.
    Each case occupies 2 lines, each gives the information of a sequence. For each sequence, the first positive integer N (≤1000000) is the size of that sequence. Then N integers follow, separated by a space.
    It is guaranteed that all the integers are in the range of long int.

输出:

    For each test case you should output the median of the two given sequences in a line.

样例输入:
4 11 12 13 14
5 9 10 15 16 17
样例输出:

13


题目大意是: 给出两个数组, 现在要求两个数组 合并成一个数组后的中位数

这题其实我开始的思路是:

首先 分别求 数组 A , B 的中位数 a , b

如 果 a = b 那么 a 就是合并后的中位数

a < b 那么舍弃 数组A 中较小的一部分 ,同时舍弃 数组B 较大的那部分, 要求两次舍弃的长度要相等

b < a 那么舍弃 数组B 中较小的一部分 ,同时舍弃 数组A 较大的那部分, 要求两次舍弃的长度要相等

下面是实现代码: 不过没有AC掉

#include<stdio.h>
using namespace std;
const int N = 1000005;
int a[N];
int b[N];
int Mid_Search(int a[], int b[], int n , int m)
{//s1 d1  m1 a[] s2 d2 m2 b[]
// s1 表示数组a 从s1 开始 d1 结束 同理数组2
    int  s1 = 0 , s2 = 0 , d1= n-1, d2 = m-1;
    int m1, m2;
    while(s1!= d1 || s2 != d2)
    {//求中位数
        m1 = (s1 + d1)/2;
        m2 = (s2 + d2)/2;
        if(a[m1] == b[m2])
        {//先判断两个的中位数是否相等
           return a[m1];
        }
        if(a[m1] < b[m2])
        {//如果a 数组的中位数小于b数组的中位数
            if((s1 + d1)%2 == 0)
            {//数组a 舍弃小的部分 数组b 舍弃大的部分
                s1 = m1;
                d2 = m2;
            }
            else
            {
                //如果为奇数从下一个开始
                s1 = m1  + 1;
                d2 = m2;
            }

        }
        else
        {
             if((d2 + s2)%2 == 0)
             {
                 s2 = m2 ;
                 d1 = m1 ;
             }
             else
             {
                 s2 =  m2 + 1;
                 d1 = m1;
             }
        }
    }
    return (a[s1] < b[s2] ? a[s1] : b[s2]);

}

int main()
{
    int n , m;
    while(scanf("%d" , &n) != EOF)
    {
        for(int i = 0 ; i < n ; i++)
        {
            scanf("%d",&a[i]);
        }
        scanf("%d", &m);
        for(int j = 0 ; j < m ; j++)
        {
            scanf("%d", &b[j]);
        }
        int ans = Mid_Search(a, b, n, m);
        printf("%d\n", ans);
    }
    return 0;

这里先说明一下nth_element 函数的使用

意思是 最终得到 第 I 大元素 并且 放在 第 I 位置上 (这里是从第0 开始数的)

测试代码:

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int iarray[]={5,6,15,89,7,2,1,3,52,63,12,64,47};
    int len=sizeof(iarray)/sizeof(int);
    int i;
    for(i=0;i<len;i++)
       cout<<iarray[i]<<" ";
    nth_element(iarray,iarray+6,iarray+len);         //排序第6个元素
        cout<<endl;
    for(i=0;i<len;i++)
       cout<<iarray[i]<<" ";
    cout<<"  第6-th个元素     "<<iarray[6]<<endl;
}

来自博客 点击打开链接 这里感谢~

下面是AC 此题代码:

#include<iostream>
#include<algorithm>
using namespace std;

long a[1000000];
int main()
{
   long i, n1, n2 ;
   while(cin>>n1)
   {
       for(i = 0 ; i < n1; i++)
       {
           cin>>a[i];
       }
       cin>>n2;
       for(;i < n1+ n2; i++)
       {
           cin>>a[i];
       }
      long  mid = (i - 1)/2;
      nth_element(a, a+mid, a+i);  //做排列求出中位数
      cout<<a[mid]<<endl;
   }
    return 0;
}



  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <strong><span style="background-color:#FFFFFF;color:#E53333;font-size:24px;">本页面购买不发书!!!仅为视频课购买!!!</span></strong> </p> <p> <strong><span style="color:#E53333;font-size:18px;">请务必到</span></strong><a href="https://edu.csdn.net/bundled/detail/49?utm_source=banner"><strong><span style="color:#E53333;font-size:18px;">https://edu.csdn.net/bundled/detail/49</span></strong></a><strong><span style="color:#E53333;font-size:18px;">下单购买课+书。</span></strong> </p> <p> <span style="font-size:14px;">本页面,仅为观看视频页面,如需一并购买图书,请</span><span style="font-size:14px;">务必到</span><a href="https://edu.csdn.net/bundled/detail/49?utm_source=banner"><span style="font-size:14px;">https://edu.csdn.net/bundled/detail/49</span></a><span style="font-size:14px;">下单购买课程+图书!!!</span> </p> <p> <br /> </p> <p> <span style="font-size:14px;">疯狂Python精讲课程覆盖《疯狂Python讲义》全书的主体内容。</span> </p> <span style="font-size:14px;">内容包括Python基本数据类型、Python列表、元组和字典、流程控制、函数式编程、面向对象编程、文件读写、异常控制、数据库编程、并发编程与网络编程、数据可视化分析、Python爬虫等。</span><br /> <span style="font-size:14px;"> 全套课程从Python基础开始介绍,逐步步入当前就业热点。将会带着大家从Python基础语法开始学习,为每个知识点都提供对应的代码实操、代码练习,逐步过渡到文件IO、数据库编程、并发编程、网络编程、数据分 析和网络爬虫等内容,本课程会从小案例起,至爬虫、数据分析案例终、以Python知识体系作为内在逻辑,以Python案例作为学习方式,最终达到“知行合一”。</span><br />
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值