[关闭]
@duyao 2015-11-01T02:52:26.000000Z 字数 1239 阅读 1381

中位数

algorithm


题目

设X[0: n-1]和Y[0: n-1]为两个数组,每个数组中含有n个己排好序的数。试设计一个〇(logn)时间的分治算法,找出X和y的2n个数的中位数,并证明算法的时间复杂性为〇(logn)

思路

本题目已说明时间复杂度为〇(logn),因此不是简单地遍历,因此选中二分来解题。

当数组中数字个数为偶数时

数字代表位置,而不是大小
X: 1,2,3,4
Y:11,22,33,44
将X,Y合并时,新数组共有8个数字,也就是中位数是第4个数字

分情况讨论:

当数组中数字个数为奇数时

数字代表位置,而不是大小
X: 1,2,3,4,5
Y:11,22,33,44,55
将X,Y合并时,新数组共有10个数字,也就是中位数是第5个数字

分情况讨论:

代码

  1. /**
  2. * @param a 数组a
  3. * @param as 数组a第一个数的下标
  4. * @param ae 数组a最后一个数的下标
  5. * @param b 数组b
  6. * @param bs 数组b第一个数的下标
  7. * @param be 数组b最后一个数的下标
  8. * @return 合并后中位数
  9. */
  10. public int find (int []a, int as, int ae, int []b, int bs, int be){
  11. int len = ae - as + 1;
  12. int amid = as + len/2;
  13. int bmid = bs + len/2;
  14. if(len == 1){
  15. return Math.min(a[amid], b[bmid]);
  16. }
  17. //奇偶标志位
  18. int flag = 0;
  19. if(len%2 == 0){
  20. amid -= 1;
  21. bmid -= 1;
  22. flag = 1;
  23. }
  24. if(a[amid] > b[bmid]){
  25. return find(a, as, amid, b, bmid + flag, be);
  26. }else if(a[amid] < b[bmid]){
  27. return find(a, amid + flag, ae, b, bs, bmid);
  28. }else{
  29. return a[amid];
  30. }
  31. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注