第九章-查找-静态查找表

一、单选题

1、

答案:B

解析:比较的次数最多为(log2底n的整数部分)+1


2、

答案:A

解析:log2底n的整数部分是6+1=7


3、

答案:B

解析:这个题就是从头3个3个的向后移动,所以,在接近开头处比较次数最少


4、

答案:A

解析:

A:根节点                左5右4

第二层根节点分别是 左2右2    左2右1 与第一层大小之比相同,以下几层同理

B:根节点      左5右5

第二层根节点 左2右2

第三层根节点 左1右0 左1右0 左0右1 左0右1  四者大小比较不一,所以不是

C:根节点                 左4右4

第二层根节点分别是 左1右2    左2右1 两者大小比较不一,所以不是

D:根节点                 左4右5

第二层根节点分别是 左2右1    左2右2 存在与第一层大小之比不同的,所以不是


二、编程题

1、两个有序序列的中位数 (25 分)

已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A​0​​,A​1​​,⋯,A​N−1​​的中位数指A​(N−1)/2​​的值,即第⌊(N+1)/2⌋个数(A​0​​为第1个数)。

输入格式:

输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。

输出格式:

在一行中输出两个输入序列的并集序列的中位数。

输入样例1:

5
1 3 5 7 9
2 3 4 5 6

输出样例1:

4

输入样例2:

6
-100 -10 1 1 1 1
-50 0 2 3 4 5

输出样例2:

1

答案

#include <bits/stdc++.h>

using namespace std;
int GetMid(int a[],int b[],int n)
{
    int a1=0,b1=0;
    while(a1+b1!=n-1)
    {
        if(a[a1]>b[b1])
            b1++;
        else
            a1++;
    }
    return a[a1]>b[b1]?b[b1]:a[a1];
}
int main()
{
    int a[1000000];
    int b[1000000];
    int n;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=0; i<n; i++)
    {
        scanf("%d",&b[i]);
    }
    int mid=GetMid(a,b,n);
    printf("%d\n",mid);
    return 0;
}

 注意

1、找两个数组的中位数,不一定非要将两个数组合并,可以借两个变量,在两个数组上不断移动

2、整体思路

  • 找中位数的思路就是,先有从小到大的顺序,然后,从前往后,中位数左边有n-1个,右边有n-1个
  • 这个题中,已经排好序了,可以借两个变量,在两个数组上不断移动
  • 哪个数组上的数据更小,就让哪个数组上的数据往后移动一个
  • 当总共移动了n-1的时候,就停止,因为第n-1个位置上就是中位数
  • 到底是取哪个数组上的元素呢?取小的数组上的元素,因为如果是两个数除以2,最终是向下取整的

3、此题表达有误,不需要去重

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值