首页 > 编程语言 > 详细

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

时间:2019-09-20 14:13:19      阅读:151      评论:0      收藏:0      [点我收藏+]
7-3 两个有序序列的中位数 (20 分)
 

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

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


    

  


 

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

原文:https://www.cnblogs.com/liyuan1/p/11556157.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!