题目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\n",ans); } }
作者: AlvinZH
出处: http://www.cnblogs.com/AlvinZH/
本人Github:https://github.com/Pacsiy/JobDu
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.