|
1 | 1 | class Solution(object):
|
| 2 | + # def findMedianSortedArrays(self, nums1, nums2): |
| 3 | + # """ |
| 4 | + # :type nums1: List[int] |
| 5 | + # :type nums2: List[int] |
| 6 | + # :rtype: float |
| 7 | + # """ |
| 8 | + # p1 = p2 = 0 |
| 9 | + # ls1 = len(nums1) |
| 10 | + # ls2 = len(nums2) |
| 11 | + # all_nums = [] |
| 12 | + # median = 0.0 |
| 13 | + # while p1 < ls1 and p2 < ls2: |
| 14 | + # if nums1[p1] < nums2[p2]: |
| 15 | + # all_nums.append(nums1[p1]) |
| 16 | + # p1 += 1 |
| 17 | + # else: |
| 18 | + # all_nums.append(nums2[p2]) |
| 19 | + # p2 += 1 |
| 20 | + # if p1 < ls1: |
| 21 | + # while p1 < ls1: |
| 22 | + # all_nums.append(nums1[p1]) |
| 23 | + # p1 += 1 |
| 24 | + # if p2 < ls2: |
| 25 | + # while p2 < ls2: |
| 26 | + # all_nums.append(nums2[p2]) |
| 27 | + # p2 += 1 |
| 28 | + # # print all_nums |
| 29 | + # if (ls1 + ls2) % 2 == 1: |
| 30 | + # median = all_nums[(ls1 + ls2) / 2] |
| 31 | + # else: |
| 32 | + # median = 1.0 * (all_nums[(ls1 + ls2) / 2] + all_nums[(ls1 + ls2) / 2 - 1]) / 2 |
| 33 | + # return median |
| 34 | + |
2 | 35 | def findMedianSortedArrays(self, nums1, nums2):
|
3 |
| - """ |
4 |
| - :type nums1: List[int] |
5 |
| - :type nums2: List[int] |
6 |
| - :rtype: float |
7 |
| - """ |
8 |
| - p1 = p2 = 0 |
9 |
| - ls1 = len(nums1) |
10 |
| - ls2 = len(nums2) |
11 |
| - all_nums = [] |
12 |
| - median = 0.0 |
13 |
| - while p1 < ls1 and p2 < ls2: |
14 |
| - if nums1[p1] < nums2[p2]: |
15 |
| - all_nums.append(nums1[p1]) |
16 |
| - p1 += 1 |
| 36 | + N1, N2 = len(nums1), len(nums2) |
| 37 | + if N1 < N2: |
| 38 | + nums1, N1, nums2, N2 = nums2, N2, nums1, N1 |
| 39 | + l, r = 0, N2 * 2 |
| 40 | + while l <= r: |
| 41 | + mid2 = (l + r) >> 1 |
| 42 | + mid1 = N1 + N2 - mid2 |
| 43 | + L1 = -sys.maxint - 1 if mid1 == 0 else nums1[(mid1 - 1) >> 1] |
| 44 | + L2 = -sys.maxint - 1 if mid2 == 0 else nums2[(mid2 - 1) >> 1] |
| 45 | + R1 = sys.maxint if mid1 == 2 * N1 else nums1[mid1 >> 1] |
| 46 | + R2 = sys.maxint if mid2 == 2 * N2 else nums2[mid2 >> 1] |
| 47 | + if L1 > R2: |
| 48 | + l = mid2 + 1 |
| 49 | + elif L2 > R1: |
| 50 | + r = mid2 - 1 |
17 | 51 | else:
|
18 |
| - all_nums.append(nums2[p2]) |
19 |
| - p2 += 1 |
20 |
| - if p1 < ls1: |
21 |
| - while p1 < ls1: |
22 |
| - all_nums.append(nums1[p1]) |
23 |
| - p1 += 1 |
24 |
| - if p2 < ls2: |
25 |
| - while p2 < ls2: |
26 |
| - all_nums.append(nums2[p2]) |
27 |
| - p2 += 1 |
28 |
| - # print all_nums |
29 |
| - if (ls1 + ls2) % 2 == 1: |
30 |
| - median = all_nums[(ls1 + ls2) / 2] |
31 |
| - else: |
32 |
| - median = 1.0 * (all_nums[(ls1 + ls2) / 2] + all_nums[(ls1 + ls2) / 2 - 1]) / 2 |
33 |
| - return median |
| 52 | + return (max(L1, L2) + min(R1, R2)) / 2.0 |
34 | 53 |
|
35 | 54 |
|
36 | 55 | if __name__ == '__main__':
|
|
0 commit comments