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)

  1. A,B前半段数字的个数(包含中点)大于k:
    • A[mid]大于B[mid],新的搜索范围为B的全部和A的前半段(不包括mid)。
    • B[mid]大于等于A[mid],新的搜索范围为A的全部和B的前半段(不包括mid)。
  2. 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 };
原文地址:https://www.cnblogs.com/panda_lin/p/median_of_two_sorted_arrays.html