1.实践题目:
两个有序序列的中位数
2.问题描述:
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。
输入格式:
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的并集序列的中位数。
3.算法描述:
#include<iostream> using namespace std; const int maxn = 1e5+5; int a[maxn],b[maxn]; int n,x,cnt=1,cnt1=1,cnt2=1,ans=0; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) cin>>b[i]; for(;cnt<=n+1;cnt++){ if(cnt1==n+1) x=b[cnt2++]; else if(cnt2==n+1) x=a[cnt1++]; else if(a[cnt1]<b[cnt2]) x=a[cnt1++]; else x=b[cnt2++]; if(cnt==n||cnt==n+1) ans+=x; } cout<<ans/2<<endl; }
开两个数组存两个序列,然后用两个指针从头按大小一路扫过去并用,cnt和x记录新序列的位置和值,由于没有去重,那么新序列的中位数就是指针扫到n和n+1时的平均值。
4.算法时间及空间复杂度分析:
由于是线性的直接遍历一遍,所以时间复杂度是O(N)的;
空间复杂度上,我开了两个1e5+5的数组,所以空间复杂度是O(2e5);
5.心得体会
这题虽然说是并集但其实不用去重,去重的话你最后一个样例是过不了的,因为这个原因我debug了大半小时。