题目

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. 079-PHP数组排序,两次循环法封装成函数

    <?php function mysort($arr){ //将排序的代码封装为函数 echo '<br />数组排序之前的信息:<br />'; print_r($ar ...

  2. 电影网站的电影m3u8源址分享(存储于mysql数据库,可直接应用在电影网站上使用)

    说明: 1.包含一个films.sql文件,基于mysql5.6的数据表导出文件. 2.该sql文件里面包含一个mysql数据表films,内含35000部电影m3u8源地址. 3.films数据表包 ...

  3. 实验吧-杂项-你没有见过的加密!(php srand()和rand()函数)

    什么垃圾东西,弄半天,Windows上运行乱码,linux上7.3的php运行也是乱码(气死). 下载文件,查看内容 <?php function encrypt($str) { $crypte ...

  4. gdb 常用选项

    gdb 常用选项 help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r st ...

  5. ERROR in Cannot find module 'node-sass'

    windows下,通过淘宝的npm镜像安装 npm install node-sass --registry=https://registry.npm.taobao.org (之前安装好过,一段时间没 ...

  6. no_string_attached笔记

    下载附件以后,在终端中查看 第一次调试时发现权限不够 接着,返回文件夹,修改该目标权限 然后进行调试 使用info  reg 查看寄存器的值 发现eflags寄存器为0x282,然后x/282 $ea ...

  7. PHP的操作符与控制结构

    一.操作符  操作符是用来对数组和变量进行某种操作运算的符号. 算术操作符 操作符 名称 示例 + 加 $a+$b - 减 $a-$b * 乘 $a*$b / 除 $a/$b % 取余 $a%$b 复 ...

  8. 资源的合并与压缩-html压缩

    资源的合并:减少http请求数量 资源的压缩:减少请求资源的大小 html压缩 html代码压缩就是压缩这些在文本文件中有意义,但是在html中不显示的字符,包括空格,制表符,换行符等,还有一些其他意 ...

  9. DispatcherServlet(2)_HandlerMapping

    HandlerMapping_xmind SpringMVC默认提供的HandlerMapping BeanNameUrlHandlerMapping SimpleUrlHandlerMapping ...

  10. ODBC OLEDB

    ODBC  OLEDB https://www.cnblogs.com/dachuang/p/8615754.html