[作业系列]算法第二章上机实践报告

1.实践题目:

两个有序序列的中位数 

2.问题描述:

已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0​​,A1​​,,AN1​​的中位数指A(N1)/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了大半小时。

猜你喜欢

转载自www.cnblogs.com/kgs719/p/9784167.html
今日推荐