leetcode: Median of Two Sorted Arrays
http://oj.leetcode.com/problems/median-of-two-sorted-arrays/
There are two sorted arrays A and B 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)).
思路:
对一维数组的二分查找进行扩展(findKthNumber函数的实现)。先分别定位在A,B的中点。现在分两种情况:(mid = middle)
- A,B前半段数字的个数(包含中点)大于k:
- A[mid]大于B[mid],新的搜索范围为B的全部和A的前半段(不包括mid)。
- B[mid]大于等于A[mid],新的搜索范围为A的全部和B的前半段(不包括mid)。
- A,B前半段数字的个数(包含中点)小于等于k:
- A[mid]大于B[mid],新的搜索范围为A的全部和B的后半段(不包括mid),并且k更新为k - (b_mid - b_start + 1)。因为B的前半段可以舍弃,第k个数必然出现在新的搜索范围内,并且因为B的前半段被舍弃,k的值也需要做相应调整。
- B[mid]大于等于A[mid],新的索索范围为B的全部和A的后半段(不包括mid),并且k更新为k - (a_mid - a_start + 1)。原理同上。
基于以上分析,我们就很容易写出一个基于递归的实现。
1 class Solution { 2 public: 3 int findKthNumber(int A[], 4 int a_start, 5 int a_end, 6 int B[], 7 int b_start, 8 int b_end, 9 int k) { 10 if (a_start > a_end) { 11 return B[b_start + k - 1]; 12 } 13 14 if (b_start > b_end) { 15 return A[a_start + k - 1]; 16 } 17 18 int a_mid = (a_start + a_end) / 2, b_mid = (b_start + b_end) / 2; 19 int a_len = a_mid - a_start + 1; 20 int b_len = b_mid - b_start + 1; 21 int len = a_len + b_len; 22 23 if (len > k) { 24 if (A[a_mid] > B[b_mid]) { 25 return findKthNumber(A, a_start, a_mid - 1, B, b_start, b_end, k); 26 } 27 else { 28 return findKthNumber(A, a_start, a_end, B, b_start, b_mid - 1, k); 29 } 30 } 31 else { 32 if (A[a_mid] > B[b_mid]) { 33 return findKthNumber(A, a_start, a_end, B, b_mid + 1, b_end, k - b_len); 34 } 35 else { 36 return findKthNumber(A, a_mid + 1, a_end, B, b_start, b_end, k - a_len); 37 } 38 } 39 } 40 41 double findMedianSortedArrays(int A[], int m, int B[], int n) { 42 bool even = (0 == ((m + n) % 2)); 43 int mid = even ? (m + n) / 2 : (m + n) / 2 + 1; 44 int v_1 = findKthNumber(A, 0, m - 1, B, 0, n - 1, mid); 45 46 if (!even) { 47 return v_1; 48 } 49 else { 50 int v_2 = findKthNumber(A, 0, m - 1, B, 0, n - 1, mid + 1); 51 return (double)(v_1 + v_2) / 2.0f; 52 } 53 } 54 };