第二次算法作业-实验报告
算法第二章上机实践报告-7-3 两个有序序列的中位数
7-3 两个有序序列的中位数 (20 分)
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列,的中位数指A(N−1)/2的值,即第⌊个数(A0为第1个数)。
输入格式:
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的并集序列的中位数。
输入样例1:
5
1 3 5 7 9
2 3 4 5 6
输出样例1:
4
输入样例2:
6
-100 -10 1 1 1 1
-50 0 2 3 4 5
输出样例2:
1
算法描述:
1.先用一次归并排序将两个数组放在一个新创建的大小为2*num.length的数组中
2.对该数组进行去重,并用k记录新排序的数组的大小
3.返回该数组的第k/2个元素
代码如下:
public static int Mid(int[] num1,int[] num2){
int[] temp=new int[2*num1.length];
int i=0,j=0,m=0;
while(i<num1.length&&j<num2.length){
temp[m++]=num1[i]<num2[j]?num1[i++]:num2[j++];
}
while(i<num1.length){
temp[m++]=num1[i++];
}
while(j<num2.length){
temp[m++]=num2[j++];
}
int k=0;
for(int l=1;l<temp.length;l++){
if(temp[l]!=temp[k]){
temp[++k]=temp[l];
}
}
return temp[k/2];
}
复杂度分析:
时间复杂度:一次归并排序里共三次循环,再加上去重的一次循环,应该是O(n)
空间复杂度:创建了一个临时数组,大小为2*num.length,故应该是O(n)
总结:
1.思路简单,但也存在问题,对于测试用例中的最大N,会显示运行超时,
对二分还是不很熟悉,还需继续熟悉分治法。