码迷,mamicode.com
首页 > 其他好文 > 详细

Median of Two Sorted Arrays

时间:2015-10-03 20:41:54      阅读:277      评论:0      收藏:0      [点我收藏+]

标签:

 

题目:

  There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

 

思路:

  寻找中间的数,等价于寻找第 (m+n)/2 大的数,要求时间复杂度再 O(log (m+n)) ,其实就是告诉我们要用二分的方法在两个数组中找第 k 大的数,用以下方法递归查找 (假设 a 数组长度比 b 小):

  1. 若 a 数组长度为0,返回 b[k-1];
  2. 若 k == 1 ,返回 min(a[0], b[0]);
  3. 取 a 数组中值为 min(k/2, aSize) ,b 数组中值为 k - aMid
    • 若 a[aMid] < b[bMid] ,递归在数组 a[aMid..aSize] 和 b[0..bSize] 中找第 k-aMid 大的元素
    • 若 a[aMid] > b[bMid] ,递归在数组 a[0..aSize] 和 b[bMid..bSize] 中找第 k-bMid 大的元素
    • 否则,第 a[aMid]就是所求的第 k 小的数。

  简单解释一下递归思路:我们比较 a[k/2] 和 b[k/2] 两个元素,这两个元素分别表示 a 的第 k/2 小的元素和 b 的第 k/2 小的元素。如果 a[k/2] < b[k/2],说明 a[0] 到 a[k/2] 的元素都在合并后的前k小的元素中,要找第 k 小的数,只需从 a[k/2] 到 a[aSize] 中找第 k/2 小的元素。

 

代码:

技术分享
 1 #define min(a,b) (a) > (b)? (b) : (a)
 2 double findKth(int * a, int aSize, int * b, int bSize, int k)
 3 {
 4     if (aSize > bSize)
 5         return findKth(b, bSize, a, aSize, k);
 6     if (aSize == 0)
 7         return b[k - 1];
 8     if (k == 1)
 9         return min(a[0], b[0]);
10 
11     int aMid = min(k / 2, aSize), bMid = k - aMid;
12     if (a[aMid - 1] < b[bMid - 1])
13         return findKth(a + aMid, aSize - aMid, b, bSize, k - aMid);
14     else if (a[aMid - 1] > b[bMid - 1])
15         return findKth(a, aSize, b + bMid, bSize - bMid, k - bMid);
16     else
17         return a[aMid - 1];
18 }
19 
20 double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
21     int total = nums1Size + nums2Size;
22     if (total % 2 == 1)
23         return findKth (nums1, nums1Size, nums2, nums2Size, total / 2 + 1);
24     else
25         return (findKth(nums1, nums1Size, nums2, nums2Size, total / 2)
26                 + findKth(nums1, nums1Size, nums2, nums2Size, total / 2 + 1)) / 2;
27 }
Median of Two Sorted Arrays

 

Median of Two Sorted Arrays

标签:

原文地址:http://www.cnblogs.com/YaolongLin/p/4853767.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!