|
| 1 | +def find_median_sorted_arrays(array_A, array_B): |
| 2 | + m, n = len(array_A), len(array_B) |
| 3 | + # 如果数组A的长度大于等于数组B,则交换数组 |
| 4 | + if m > n: |
| 5 | + array_A, array_B, m, n = array_B, array_A, n, m |
| 6 | + if n == 0: |
| 7 | + raise ValueError |
| 8 | + start, end, half_len = 0, m, (m + n + 1) // 2 |
| 9 | + while start <= end: |
| 10 | + i = (start + end) // 2 |
| 11 | + j = half_len - i |
| 12 | + if i < m and array_B[j-1] > array_A[i]: |
| 13 | + # i偏小了,需要右移 |
| 14 | + start = i + 1 |
| 15 | + elif i > 0 and array_A[i - 1] > array_B[j]: |
| 16 | + # i偏大了,需要左移 |
| 17 | + end = i - 1 |
| 18 | + else: |
| 19 | + # i刚好合适,或i已达到数组边界 |
| 20 | + if i == 0: |
| 21 | + max_of_left = array_B[j-1] |
| 22 | + elif j == 0: |
| 23 | + max_of_left = array_A[i-1] |
| 24 | + else: |
| 25 | + max_of_left = max(array_A[i-1], array_B[j-1]) |
| 26 | + if (m + n) % 2 == 1: |
| 27 | + # 如果大数组的长度是奇数,中位数就是左半部分的最大值 |
| 28 | + return max_of_left |
| 29 | + if i == m: |
| 30 | + min_of_right = array_B[j] |
| 31 | + elif j == n: |
| 32 | + min_of_right = array_A[i] |
| 33 | + else: |
| 34 | + min_of_right = min(array_A[i], array_B[j]) |
| 35 | + # 如果大数组的长度是偶数,取左侧最大值和右侧最小值的平均 |
| 36 | + return (max_of_left + min_of_right) / 2.0 |
| 37 | + |
| 38 | + |
| 39 | +my_array_A = list([3, 5, 6, 7, 8, 12, 20]) |
| 40 | +my_array_B = list([1, 10, 17, 18]) |
| 41 | +print(find_median_sorted_arrays(my_array_A, my_array_B)) |
| 42 | + |
0 commit comments