题目

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 nondecreasing 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.

Input

Each input file contains 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.

Output

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

Sample Input

4 11 12 13 14

5 9 10 15 16 17

Sample Output

13

题目分析

已知两个有序序列S1,S2,求有序序列S中间位置的元素(S=S1+S2)

解题思路

  1. 输入S1,S2并合并,打印中间位置元素
  2. two pointer思想:两个指针,分别指向S1,S2当前元素,比较大小,先将小的合并,并向前移动一位
  3. 合并时优化
    • 1 只要到达中间位置即可打印退出,不需要处理后续数据的合并;
    • 2 哨兵简化合并操作

易错点

  1. S长度分别为偶数和奇数时,中间位置计算为(N1+N2-1)>>1

知识点

  1. 利用哨兵简化合并操作
  2. two pointer思想合并两个有序集合为一个有序集合

Code

Code 01(最优、哨兵简化合并、中间位置后数据不处理)

#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char * argv[]) {
// 1 输入数据
int N1,N2;
scanf("%d",&N1);
int S1[N1+1]= {0};
for(int i=0; i<N1; i++)scanf("%d",&S1[i]);
scanf("%d",&N2);
int S2[N2+1]= {0};
for(int i=0; i<N2; i++)scanf("%d",&S2[i]);
S1[N1]=S2[N2]=0x7fffffff;// 哨兵 // 2 合并序列--哨兵+若索引到达midpos,直接打印S[midpost],后面的数据不需要处理
int i=0,j=0,index=0,cnt=0,S[N1+N2]= {0};
int midpos = (N1+N2-1)>>1;
while(index<N1+N2) {
if(S1[i]<=S2[j]) S[index++]=S1[i++];
else S[index++]=S2[j++];
if(index-1==midpos) break;
}
printf("%d",S[midpos]); return 0;
}

Code 02(哨兵简化合并、中间位置后续数据处理)

#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char * argv[]) {
// 1 输入数据
int N1,N2;
scanf("%d",&N1);
int S1[N1+1]= {0};
for(int i=0; i<N1; i++)scanf("%d",&S1[i]);
scanf("%d",&N2);
int S2[N2+1]= {0};
for(int i=0; i<N2; i++)scanf("%d",&S2[i]);
S1[N1]=S2[N2]=0x7fffffff;// 哨兵 // 2 合并序列--哨兵
int i=0,j=0,index=0,S[N1+N2]= {0};
while(index<N1+N2) {
if(S1[i]<=S2[j]) {
S[index++]=S1[i++];
} else {
S[index++]=S2[j++];
}
} printf("%d",S[((N1+N2-1)>>1)]);
return 0;
}

Code 03(无哨兵简化合并、中间位置后续数据处理)

#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char * argv[]) {
// 1 输入数据
int N1,N2;
scanf("%d",&N1);
int S1[N1]= {0};
for(int i=0; i<N1; i++)scanf("%d",&S1[i]);
scanf("%d",&N2);
int S2[N2]= {0};
for(int i=0; i<N2; i++)scanf("%d",&S2[i]); // 2 合并序列
int i=0,j=0,index=0,S[N1+N2]= {0};
while(i<N1&&j<N2) {
if(S1[i]<=S2[j]) {
S[index++]=S1[i++];
} else {
S[index++]=S2[j++];
}
}
while(i<N1)S[index++]=S1[i++];
while(j<N2)S[index++]=S2[j++]; printf("%d",S[((N1+N2-1)>>1)]);
return 0;
}

PAT Advanced 1029 Median (25) [two pointers]的更多相关文章

  1. PAT甲 1029. Median (25) 2016-09-09 23:11 27人阅读 评论(0) 收藏

    1029. Median (25) 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given an incr ...

  2. PAT 甲级 1029 Median (25 分)(思维题,找两个队列的中位数,没想到)*

    1029 Median (25 分)   Given an increasing sequence S of N integers, the median is the number at the m ...

  3. 【PAT】1029. Median (25)

    Given an increasing sequence S of N integers, the median is the number at the middle position. For e ...

  4. 1029 Median (25 分)

    1029 Median (25 分)   Given an increasing sequence S of N integers, the median is the number at the m ...

  5. PAT (Advanced Level) 1029. Median (25)

    scanf读入居然会超时...用了一下输入挂才AC... #include<cstdio> #include<cstring> #include<cmath> #i ...

  6. PAT 1029 Median (25分) 有序数组合并与防坑指南

    题目 Given an increasing sequence S of N integers, the median is the number at the middle position. Fo ...

  7. PAT甲题题解-1029. Median (25)-求两序列的中位数,题目更新了之后不水了

    这个是原先AC的代码,但是目前最后一个样例会超内存,也就是开不了两个数组来保存两个序列了,意味着我们只能开一个数组来存,这就需要利用到两个数组都有序的性质了. #include <iostrea ...

  8. 【PAT甲级】1029 Median (25 分)

    题意: 输入一个正整数N(<=2e5),接着输入N个非递减序的长整数. 输入一个正整数N(<=2e5),接着输入N个非递减序的长整数.(重复一次) 输出两组数合并后的中位数.(200ms, ...

  9. PAT 甲级 1029 Median

    https://pintia.cn/problem-sets/994805342720868352/problems/994805466364755968 Given an increasing se ...

随机推荐

  1. 143-PHP printf函数

    <?php $num=123.456; //定义一个浮点数变量 printf('以整数形式输出:%d',$num); //格式化为有符号十进制整数后输出 ?> <?php $num= ...

  2. 负载均衡与CDN简介

    负载均衡 负载均衡是高可用网络基础架构的的一个关键组成部分,有了负载均衡,我们通常可以将我们的应用服务器部署多台,然后通过负载均衡将用户的请求分发到不同的服务器用来提高网站.应用.数据库或其他服务的性 ...

  3. junit基础学习之-测试service层(3)

    测试步骤: 在之前的文章中已经加了junit的环境,这就不需要了. 1.加载junit类,spring配置文件,指明junit测试器,@Runwith 2.定义变量,service,不可以使用spri ...

  4. Linux基础学习准备

    Linux 基础学习准备 工欲善其事必先利其器,还是买个服务器折腾比较好. 虚拟机和镜像 推荐吾爱的:吾爱虚拟机2.0 CentOS镜像: Centos国内下载源 http://man.linuxde ...

  5. POJ 3994:Probability One

    Probability One Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1674   Accepted: 1151 D ...

  6. 分享几个IntelliJ IDEA 2019 jihuo码(pojie码、zhuce码),亲测可用

    文章转载自:https://www.jiweichengzhu.com/article/eb340e382d1d456c84a1d190db12755c 如果还有问题,加群交流:686430774(就 ...

  7. 线性数据结构案例1 —— 单向链表中获取倒数k个节点

    一.介绍  先遍历整个链表获取链表长度length,然后通过 (length-index) 方式得到我们想要节点在链表中的位置. 二.代码 public Node findLastIndexNode( ...

  8. 输入框中提示信息(html5)

    placeholder 属性规定可描述输入字段预期值的简短的提示信息(比如:一个样本值或者预期格式的短描述). 该提示会在用户输入值之前显示在输入字段中. 注意:placeholder 属性适用于下面 ...

  9. 19 01 12 javascript 定时器 封闭函数

    定时器 定时器在javascript中的作用1.制作动画2.异步操作3.函数缓冲与节流 定时器: setTimeout 只执行一次的定时器 clearTimeout 关闭只执行一次的定时器 setIn ...

  10. 强大的代码生成器——T4模板

    T4 Editor工具下载地址 tangible T4 Editor 2.5.0 plus modeling tools for VS 2019 https://marketplace.visuals ...