算法第二章上机实践报告-7-3 两个有序序列的中位数

7-3 两个有序序列的中位数 (20 分)
 

已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列,的中位数指A(N1)/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,会显示运行超时,

  对二分还是不很熟悉,还需继续熟悉分治法。


    

  


 

posted @ 2019-09-20 11:58  元夕~  阅读(326)  评论(0编辑  收藏  举报